又是自闭的一下午,但是收获还是挺多的。下面总结一下。
比赛链接
A
看这道题,就算不会也能猜到奇偶的问题,但是我把输入的层数和里面的变量都用了n,然后就陷入了自闭。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <set> #include <string> #include <stack> using namespace std;
int main() { int n,k; cin >> n; while(n--) { scanf("%d",&k); if(k % 2)cout << "Balanced" << '\n'; else cout << "Bad" << '\n'; }
}
|
B
看题目中的2,3,5,7以及样例,直接发现类似做过的一道humble number题目,紫书也出现了(优先队列做的),可以移步题目
类似的这道题已经很熟练了,速度的敲完,发现TLE。什么情况,我都预处理完了。。发现询问的次数可以达到500000,因此二分,因为预处理的数组是有序的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <set> #include <string> #include <stack> using namespace std;
int a[5900];
void f() { int aa ,bb,cc,dd ; aa = 0,bb = 0,cc = 0, dd = 0; a[0] = 1; for(int i = 1; i <= 5842; ++i) { a[i] = min(2 * a[aa], min(3 * a[bb], min(5 * a[cc], 7 * a[dd]))); if(a[i] == 2 *a[aa]) aa++; if(a[i] == 3 * a[bb]) bb++; if(a[i] == 5 * a[cc]) cc++; if(a[i] == 7* a[dd]) dd++; } } int main() { f(); int n; scanf("%d",&n); int num; while(n--) { scanf("%d",&num); int m = lower_bound(a , a + 5500, num) - a; printf("%d\n",a[m]); } }
|
C
也是自闭的一道题目,本身很简单。我想到N很大的时候,答案就确定了,可是为什么还是不对呢?? 后来看到输入不超过1M,什么概念?? 不清楚,看来输入上可能会出现超级大的一串数字了,所以输入改用string就过了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <set> #include <string> #include <stack> #include <math.h> using namespace std;
int zhuanhuan(string s) { int sum = 0; for(int i = 0; i < s.size(); ++i) { sum = sum * 10 + s[i] - '0'; } return sum; } int main() { string s; while(cin >> s) { if(s.size() >= 7){ printf("1.64493\n"); continue; } int n = zhuanhuan(s); double sum = 0; if(n >= 115000) { printf("1.64493\n"); continue; } for(int i = 1 ; i<=n; ++i) { double num = double((1.0/i)*(1.0/i)); sum += num; } printf("%.5lf\n",sum); } }
|
G
数学题,按说应该不会也能猜出这个公式的,但是真的猜不出来啊QWQ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <set> #include <string> #include <stack> #include <math.h> using namespace std;
int main() { long long n,k; while(cin >> n >> k) { cout << (n - k + 1)*k << '\n'; }
}
|
H
想到先求最长上升或者下降子序列的长度,但是却用到了单调栈,敲完才想到,单调栈的单调性是从第一个元素就开始确定的,可能我们都应该删除第一个元素,自闭了。还是老老实实用模板把。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <set> #include <string> #include <stack> #include <math.h> using namespace std;
int dp[100005]; int s[100005]; int main() { int t,n,k;; cin >> t; while(t--) { int len; scanf("%d %d",&n,&k); for(int i = 1; i <= n; ++i) { scanf("%d",&s[i]); } dp[1] = s[1]; len = 1; for(int i = 2; i <= n; ++i) { if(s[i] > dp[len]){ dp[++len] = s[i]; } else{ int m = lower_bound(dp +1,dp + len + 1,s[i])- dp; dp[m] = s[i]; } } int len1 = len; for(int i = 1; i <= n/2; ++i) { swap(s[i],s[n-i+1]); } dp[1] = s[1]; len = 1; for(int i = 2; i <= n; ++i) { if(s[i] > dp[len]){ dp[++len] = s[i]; } else{ int m = lower_bound(dp + 1,dp + len + 1,s[i])- dp; dp[m] = s[i]; } } int len2 = len; if(n - len1 <= k || n - len2 <= k) cout << "A is a magic array." << '\n'; else cout << "A is not a magic array." << '\n'; } }
|
I
开始大意了,没想到要开始就要消耗的情况,我直接用总的消耗和总的收获做差,然后我还奇怪,这么简单么。后来想到开始的路程可能是消耗的大于收获的,把这个差值积累一下,记录一下最大值即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <set> #include <string> #include <stack> using namespace std; int LL[105]; int RR[105]; int main() { int t,caser = 1; int n,A,B,L; cin >> t; while(t--) { cin >> n >> A >> B >> L; int sum = 0; int maxer = -1; for(int i = 1; i <= n; ++i) { cin >> LL[i] >> RR[i]; int num = (RR[i] - LL[i])*A; int num1 = (LL[i] - RR[i - 1]) * B; sum += num - num1; maxer = max(maxer,sum); } cout << "Case #" << caser++ << ": "; if(maxer <= 0) cout << '0' << '\n'; else cout << maxer << '\n'; } }
|
K
水题,但是没发现,始终在纠结别的题目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <set> #include <string> #include <stack> #include <math.h> using namespace std;
int main() { int n,caser = 1; cin >> n; while(n--) { string s; cin >> s; int i; for(i = 0; i < s.size(); ++i) { if(s[i] == '[') break; } cout << "Case #" << caser++ << ": "; string s2; char c = s[i + 1]; if(c == 'B') { cout << "0.00"; } if(c == 'M') { double num = (pow(10,6) * 1.0)/(pow(2,20)) * 100; double a = 100 - num; printf("%.2f",a); } if(c == 'K') { double num = (pow(10,3) * 1.0)/(pow(2,10)) * 100; double a = 100 - num; printf("%.2f",a); } if(c == 'G') { double num = (pow(10,9) * 1.0)/(pow(2,30)) * 100; double a = 100 - num; printf("%.2f",a); } if(c == 'T') { double num = (pow(10,12) * 1.0)/(pow(2,40)) * 100; double a = 100 - num; printf("%.2f",a); } if(c == 'P') { double num = (pow(10,15) * 1.0)/(pow(2,50)) * 100; double a = 100 - num; printf("%.2f",a); } if(c == 'E') { double num = (pow(10,18) * 1.0)/(pow(2,60)) * 100; double a = 100 - num; printf("%.2f",a); } if(c == 'Z') { double num = (pow(10,21) * 1.0)/(pow(2,70)) * 100; double a = 100 - num; printf("%.2f",a); } if(c == 'Y') { double num = (pow(10,24) * 1.0)/(pow(2,80)) * 100; double a = 100 - num; printf("%.2f",a); } cout << "%" << '\n'; } }
|
L
模拟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <iostream> #include <stdio.h> #include <algorithm> #include <queue> #include <set> #include <string> #include <stack> using namespace std;
int main() { string s; int cnt = 0; while(cin >> s) { if(s.size() <= 3)continue; for(int i = 0; i < s.size(); ++i) { if(i + 3 > s.size() - 1)break; if((s[i] == 'D' || s[i] == 'd') && (s[i + 1] == 'O' || s[i+1] == 'o') && (s[i + 2] == 'G'|| s[i+2] == 'g' )&&(s[i +3] == 'E' || s[i + 3] == 'e')) cnt++; } } cout << cnt << '\n'; }
|