> 文章列表 > 蓝桥杯刷题第十天

蓝桥杯刷题第十天

蓝桥杯刷题第十天

第一题:裁纸刀

问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有一个裁纸刀,每次可以将一张纸沿一条直线裁成两半。
小蓝用一张纸打印出两行三列共 6 个二维码,至少使用九次裁出来,下图给出了一种裁法。
在上面的例子中,小蓝的打印机没办法打印到边缘,所以边缘至少要裁 4 次。另外,小蓝每次只能裁一张纸,不能重叠或者拼起来裁。
如果小蓝要用一张纸打印出 20 行 22 列共 440 个二维码,他至少需要裁多少次?

数学问题,找到规律即可

每次都要剪四下,然后加上行与行之间剪去一次

最后每一行都要剪去 m - 1次,再乘以n行

题目链接: 裁制刀

/*
行 n, 列 m
4 + (n - 1) + (m - 1) * n
*/#include<iostream>
using namespace std;int main(){int n = 20, m = 22;cout<<4 + (n - 1) + (m - 1) * n;return 0;
}

第二题:刷题统计

问题描述
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题?
输入格式
输入一行包含三个整数 a,bn.
输出格式
输出一个整数代表天数。
评测用例规模与约定
对于 50%50% 的评测用例, 1≤a,b,n≤106.
对于 100%100% 的评测用例, 1≤a,b,n≤1018.

样例输入

10 2099

样例输出

8

先计算出来有多少个星期,这一些星期都可以刷

然后枚举,最后一个星期七天,什么时候超过刷题数量

/*
看看有几个星期
(a + b) * x <= n
*/
#include<iostream>
using namespace std;typedef long long LL;
LL a, b, n;int main(){scanf("%lld%lld%lld", &a, &b, &n);LL cnt = 0;cnt = n / (5*a + 2*b);LL t = cnt*(5*a + 2*b);if(t == n){cout<<cnt * 7<<endl;return 0;}  n -= t;for(int i = 1; i <= 7; i++){if(i <= 5) n -= a;else n-= b;if(n <= 0){cout<<cnt * 7 + i<<endl;break;}}return 0;
}

第三题:修建灌木

问题描述
爱丽丝要完成一项修剪灌木的工作。
N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌 木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开 始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晩会长高 1 厘米, 而其余时间不会长高。在第一天的 早晨, 所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
输入格式
一个正整数 N, 含义如题面所述。
输出格式
输出 N 行, 每行一个整数, 第 i 行表示从左到右第 i 棵树最高能长到多高。

样例输入

3

样例输出

4
2
4

模拟啊,每棵树最大高度,就是从开始减为0的时候,总共经过多少课树回到原来

就是最大高度

易知每棵树经过(n-i)*2课树回到自身,或者是(i-1)*2回到

取max再乘以二即可

#include<iostream>
using namespace std;int main(){int n;scanf("%d", &n);for(int i = 1; i <= n; i++)cout<<max(i - 1, n - i) * 2<<endl;return 0;
}

第四题:K倍区间

题目描述
给定一个长度为 N 的数列,A1,A2,⋯AN,如果其中一段连续的子序列 Ai,Ai+1,⋯Aj ( ij ) 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。
你能求出数列中总共有多少个 K 倍区间吗?
输入描述
第一行包含两个整数 NK(1≤N,K≤105 )。
以下 N 行每行包含一个整数 Ai ( 1≤Ai≤105 )
输出描述
输出一个整数,代表 K 倍区间的数目。
输入输出样例

输入

5 2
1
2
3
4
5

输出

6

是K的倍数,说明取模值相同

所以每次加上取模值相同的数量就行,这里开了个cnt存储

子序列的和是前缀和模板

注意范围,数量可能爆int

#include<iostream>
using namespace std;typedef long long LL;
const int N = 100010;
int n, k;
LL s[N];
int cnt[N];int main(){scanf("%d%d", &n, &k);for(int i = 1; i <= n; i++){scanf("%lld", &s[i]);s[i] += s[i-1];}LL res = 0;cnt[0] ++;for(int i = 1; i <= n; i++){res += cnt[s[i] % k];cnt[s[i] % k] ++;}printf("%lld", res);return 0;
}

今天星期一太忙了,其余待更