题目链接
总结今天下午的做题情况:做了一下第八届省赛的题目,A了3个题,做的第4个题简直是太坑了。看了题解后,真的想实名吐槽一下这个题目。(当然既然有做出来的,说明也是我的问题)
F题 这就是我想说的题目,我把复数考虑了进去,认为如果二次方程有复数解,也应该输出NO,谁知道按照题目的意思,这也是无解的情况,输出YES,因为这一点我A的好辛苦啊。剩下的分类讨论就行了。
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 #include <iostream> #include <algorithm> #include <stdio.h> #include <math.h> using namespace std;typedef long long ll;const double eps = 1e-7 ;int main () { int t,a ,b ,c; scanf ("%d" ,&t); while (t--) { scanf ("%d %d %d" ,&a,&b,&c); if (a == 0 && b == 0 && c == 0 ) { cout << "NO" << '\n' ; continue ; } if (a == 0 && b == 0 && c != 0 ) { cout << "YES" << '\n' ; continue ; } if (a == 0 && b != 0 && c == 0 ) { cout << "YES" << '\n' ; continue ; } if (a == 0 && b != 0 && c != 0 ) { if ( (-c) % b == 0 ) { cout << "YES" << '\n' ; continue ; } else { cout << "NO" << '\n' ; continue ; } } int num = b * b - 4 * a * c; if (num < 0 ) { cout << "YES" << '\n' ; continue ; } int flag = 0 ; for (int i = -11 ; i <= 11 ; ++i) { if (num == i * i) { flag = 1 ; break ; } } if (!flag) { cout << "NO" << '\n' ; continue ; } int num1 = -b + (int )sqrt (num); int num2 = -b - (int )sqrt (num); if (num1 % (2 * a) != 0 || num2 % (2 * a) != 0 ) { cout << "NO" << '\n' ; continue ; } else { cout << "YES" << '\n' ; continue ; } } }
G题 快速幂模板题。
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 #include <bits/stdc++.h> using namespace std;typedef long long ll;ll mod = 1000000007 ; long long quick (ll a,ll b) { long long ans = 1 ; a = a % mod; while (b) { if (b % 2 ) ans = ans * a % mod; b = b / 2 ; a = a * a % mod; } return ans; } int main () { ll n,m; cin >> n >>m ; ll sum = 0 ; for (ll i = 1 ; i <= n; ++i) { sum = (sum + quick (i,m)) % mod; } cout << sum << '\n' ; }
I题 先找出规律,和五一假期一次比赛的差不多,这个还简单点。看这个数对3取余的结果就行。本来想用JAVA写,后来想想直接用了大数取余。
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 #include <bits/stdc++.h> using namespace std;typedef long long ll;int elect (string s) { int sum = 0 ; for (int i = 0 ; i <= s.size (); ++i) { sum = (sum * 10 + s[i] - '0' ) % 3 ; } return sum; } int main () { string s; while (cin >> s) { int c = elect (s); if (c == 0 ) cout << '0' << '\n' ; else cout << '1' << '\n' ; } }
J题 感觉和以前做的一道题目也差不多,当时没有A,今天重新再做的时候思路就很明确了,先把每个数字从小到大排个序,然后从大数开始往前看,究竟下面的小数可不可以加呢,我们需要判断一下他对整体的结果有利没有,有的话就加上,同时还要更新总体的sum。这个题目还有注意的是sum会爆int。
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 #include <bits/stdc++.h> using namespace std;typedef long long ll;const double eps = 1e-7 ;struct node { int cnt,val; }a[200001 ]; int cmp (node a,node b) { return a.val > b.val; } int b[200001 ];int sum1[200001 ];int main () { int n; scanf ("%d" ,&n); for (int i = 1 ; i <= n; ++i) { scanf ("%d" ,&a[i].val); } for (int i = 1 ; i <= n; ++i) { scanf ("%d" ,&a[i].cnt); } sort (a + 1 ,a + n + 1 ,cmp); int tot = 0 ; sum1[0 ] = 0 ; for (int i = 1 ; i <= n ; ++i) { for (int j = 1 ; j <= a[i].cnt; ++j) { b[++tot] = a[i].val; sum1[tot] = sum1[tot - 1 ] + b[tot]; } } long long sum = 0 ; for (int i = 1 ; i <= tot; ++i) { if (sum1[i - 1 ] + b[i] > 0 ) { sum = sum + sum1[i - 1 ] + b[i]; } else { break ; } } cout << sum << '\n' ; }