2 comments
-
蔡徐坤 LV 9 MOD @ 5 months ago
他不看OJ
-
1.P2695 骑士的工作
#include <stdio.h> #include <algorithm> int sum = 0, cnt = 0, cnt_dangerous = 0; int main() { int a,b; scanf("%d%d",&a,&b); int n[a],m[b]; for(int i = 0; i < a; ++i) { scanf("%d",&n[i]); } for(int i = 0; i < b; ++i) { scanf("%d",&m[i]); } std::sort(n, n + a); std::sort(m, m + b); for(int i = 0; cnt < a && i < b; ++i) { if(m[i] >= n[cnt_dangerous]) { ++cnt; ++cnt_dangerous; sum += m[i]; } } if(cnt < a) { printf("you died!"); return 0; } printf("%d",sum); return 0; }
2.B3959 [GESP202403 四级] 做题
#include <stdio.h> #include <algorithm> int sum = 0, cnt = 1; int main() { int a; scanf("%d",&a); int n[a]; for(int i = 0; i < a; ++i) { scanf("%d",&n[i]); } std::sort(n, n + a); for(int i = 0; i < a; ++i) { if(n[i] >= cnt) { ++sum; ++cnt; } } printf("%d",sum); return 0; }
-
4.P10452 货仓选址
#include <stdio.h> #include <algorithm> int sum = 0; int main() { int a; scanf("%d",&a); int n[a]; for(int i = 0; i < a; ++i) { scanf("%d",&n[i]); } std::sort(n, n + a); for(int i = 0; i < a; ++i) { int t = n[i] - n[a >> 1]; if(t < 0) { t -= t + t; } sum += t; } printf("%d",sum); return 0; }
-
3.P1376 [USACO05MAR] Yogurt factory
#include <stdio.h> struct node{ int last_money, s_now; }minn; unsigned long long sum = 0; int week, s, money, how_many; int main() { scanf("%d%d%d%d",&week,&s,&money,&how_many); sum += money * how_many; minn.last_money = money; minn.s_now = s; for(int i = 1; i < week; ++i, minn.s_now += s) { scanf("%d%d",&money,&how_many); if(minn.last_money * how_many + how_many * minn.s_now < money * how_many) { sum += minn.last_money * how_many + how_many * minn.s_now; } else { minn.last_money = money; minn.s_now = 0; sum += money * how_many; } } printf("%llu",sum); return 0; }
-
#include<stdio.h> #include<math.h> #include<vector> using std::vector; vector <long long> num;//记录输入的数字 vector <long long> cnt;//记录最多能够砍几次 int max_cnt = 0, sum = 0;//所有竹子里能砍次数的最大值 总共砍几次(答案) int main() { int a; scanf("%d",&a); for(int i = 0, t = 0; i < a; ++i, t = 0) {//t作为每次循环的临时变量 记录第i个竹子最多能够砍几次 long long r; scanf("%lld",&r); num.push_back(r); while(r != 1) {//一直砍 直到r = 1 r = sqrtl((r >> 1) + 1);//砍完后高度 ++t;//砍的次数+1 } cnt.push_back(t);//记录第i个竹子最多能够砍几次 max_cnt = max_cnt > t ? max_cnt : t;//记录所有竹子里能砍次数的最大值 } for(int i = max_cnt; i > 0; --i) {//每次循环i都等于目前所有竹子里能砍次数的最大值 直到i = 0(所有竹子的高度都等于1) int t = 0;//t开在外面 跳出循环还能用 for(; t < a - 1; ++t) {//由于for循环内有num[t] != num[t + 1]语句 为防数组越界 for循环跳出条件为t >= a - 1 if(cnt[t] != i) {//如果这个竹子并不能被砍i次 跳过这颗竹子 continue; } if(num[t] != num[t + 1]) {//如果相邻两颗竹子高度相同 则砍伐时不增加砍伐次数 直到相邻两颗竹子高度不同 ++sum; } --cnt[t];//第t棵竹子能砍伐次数-1 num[t] = sqrtl((num[t] >> 1)+ 1);//砍伐后高度 } if(cnt[t] != i) {//如果最后竹子并不能被砍i次 跳过这颗竹子 continue; } ++sum;//砍伐次数+1 --cnt[t];//最后一棵竹子能砍伐次数-1 num[t] = sqrtl((num[t] >> 1) + 1);//砍伐后高度 } printf("%d",sum);//输出总次数 return 0; }
- 1