刷题统计
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。
他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。
请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?
输入格式
输入一行包含三个整数 a,b和 n。
输出格式
输出一个整数代表天数。
数据范围
对于 50% 的评测用例,1≤a,b,n≤10^6
对于 100%的评测用例,1≤a,b,n≤10^18
输入样例:
10 20 99
输出样例:
8
题解代码如下:
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll a,b,n,sum = 0; scanf("%lld%lld%lld",&a,&b,&n); ll flag = n / (a * 5 + b * 2); n -= (a * 5 + b * 2) * flag; sum += flag * 7; if(n / a <= 5) { sum += n / a; if(n / a == 5) { sum += (n - 5 * a) / b; if((n - 5 * a) % b > 0) sum ++; } else if(n % a > 0) { sum ++; } }else { sum += 5 + (n - 5 * a) / b; if((n - 5 * a) % b > 0) { sum ++; } } printf("%lld",sum); return 0; }
修剪灌木
爱丽丝要完成一项修剪灌木的工作。
有 NN 棵灌木整齐的从左到右排成一排。
爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。
爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。
当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。
直到修剪了最左的灌木后再次调转方向。
然后如此循环往复。
灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。
在第一天的早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
输入格式
一个正整数 N,含义如题面所述。
输出格式
输出 N 行,每行一个整数,第行表示从左到右第 i 棵树最高能长到多高。
数据范围
对于 30% 的数据,N≤10,
对于 100% 的数据,1<N≤10000。
输入样例:
3
输出样例:
4 2 4
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll fun(ll a,ll b,ll c) { if(a > c) { if(a > b) return a; else return b; } else { if(c > b) return c; else return b; } } int main() { int n, i; scanf("%d",&n); for(i = 1; i <= n; i ++) { printf("%lld\n", fun(i, 2 * (n - i), 2 * (i - 1))); } return 0; }
求和
题目描述
给定n个整数a[1],a[2],...,a[n],求两两相乘再相加的和,即
S=a[1]·a[2]+a[1]·a[3]+...+a[1]·a[n]+a[2]·a[3]+...+a[2]·a[n]+...+a[n-1]·a[n]
输入格式
第一行为正整数n,第二行为n个整数。
30%的数据:2≤n≤1000,1≤a[i]≤100。
100%的数据:2≤n≤200000,1≤a[i]≤1000。
输出格式
输出一个数字表示答案S。
输入样例
4 1 3 6 9
输出样例
117
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; const int N=200010; int s[N]; int a[N]; int n; int main() { cin >> n; ll ans = 0; for(int i = 1; i <= n; ++ i) { scanf("%d",&a[i]); s[i] += s[i - 1] + a[i]; } for(int i = n; i >= 1; i --) { ans += (ll) a[i] * s[i - 1]; } printf("%lld",ans); return 0; }
纸张尺寸
题目描述
在ISO 国际标准中定义了A0 纸张的大小为1189mm × 841mm。
将A0 纸沿长边对折后为A1 纸,大小为841mm × 594mm。
在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。
将A1 纸沿长边对折后为A2 纸,依此类推。
输入纸张的名称,请输出纸张的大小。
输入格式
输入一行包含一个字符串表示纸张的名称。
该名称一定是A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一。
输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。
输入样例
样例1: A0 样例2: A1
输出样例
样例1: 1189 841 样例2: 841 594
#include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { string a; cin >> a; if(a == "A0") printf("1189\n841"); if(a == "A1") printf("841\n594"); if(a == "A2") printf("594\n420"); if(a == "A3") printf("420\n297"); if(a == "A4") printf("297\n210"); if(a == "A5") printf("210\n148"); if(a == "A6") printf("148\n105"); if(a == "A7") printf("105\n74"); if(a == "A8") printf("74\n52"); if(a == "A9") printf("52\n37"); return 0; }
数位排序
小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。
当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。
例如,2022 排在 409 前面,因为2022 的数位之和是6,小于 409 的数位之和13。
又如,6 排在 2022 前面,因为它们的数位之和相同,而 6 小于 2022。
给定正整数n,m,请问对 1 到 n 采用这种方法排序时,排在第 m 个的元素是多少?
输入格式
输入第一行包含一个正整数n。
第二行包含一个正整数m。
30% 的评测用例,1 ≤ m ≤ n ≤ 300。
50% 的评测用例,1 ≤ m ≤ n ≤ 1000。
100%的评测用例,1 ≤ m ≤ n ≤ 10^6。
输出格式
输出一行包含一个整数,表示答案。
输入样例
13 5
输出样例
3
数据范围与提示
1到13的排序为:1, 10, 2, 11, 3, 12, 4, 13, 5, 6, 7, 8, 9。第5个数为3。
#include <iostream> #include <cstdio> #include <algorithm> #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; struct A{ int n1; int n2; bool operator < (const A a)const{ if(a.n2 != n2) return a.n2 > n2; if(a.n2 == n2) return a.n1 > n1; } }a[N]; int main() { int n, m, k, sum; cin >> n >> m; for(int i = 1; i <= n; ++ i) { a[i].n1 = i; k = a[i].n1; sum = 0; while(k) { sum += k % 10; k /= 10; } a[i].n2 = sum; } sort(a + 1, a + n + 1); cout << a[m].n1; return 0; }
选数异或
(暴力写的)
给定一个长度为 n 的数列A1,A2,... , An 和一个非负整数 x。
给定 m 次查询, 每次询问能否从某个区间 [l, r] 中选择两个数使得他们的异或等于 x。
输入格式
输入第一行包含三个整数n,m,x。
第二行包含n个整数A1,A2,...,An。
接下来m行,每行两个整数l,r表示询问区间[l, r]。
20%的测试数据:1≤n,m≤100;
40%的测试数据:1≤n,m≤1000;
100%的测试数据:1≤n,m≤100000,0≤x,Ai<2^20,1≤l≤r≤n;
输出格式
对于每个询问, 如果该区间内存在两个数的异或为 x 则输出yes, 否则输出no。
输入样例
4 4 1 1 2 3 4 1 4 1 2 2 3 3 3
输出样例
yes no yes no
#include <iostream> #include <bits/stdc++.h> using namespace std; typedef unsigned long long ll; const ll N = 100000 + 10; int n; ll arr[N] = {0}; ll brr[N] = {0}; int main() { int n, m, x; scanf("%d%d%d",&n,&m,&x); for(int i = 1; i <= n; i ++) scanf("%lld", &arr[i]); while(m --) { ll l, r, ans = 0, flag = 0; scanf("%lld%lld",&l,&r); for(int i = l; i <= r; i ++) { for(int j = i + 1; j <= r; j ++) { ans = arr[i] ^ arr[j]; if(ans == x) { flag = 1; break; } } } if(flag == 1) puts("yes"); else puts("no"); } return 0; }