出了一道原题,我明确地知道这道题在哪,但我没写,也不会写,真是自闭。
以后在考场上出现这种题,我就,我就不买衣服,不喝奶茶一个月。说到做到!
题目出得真的很跳戏,不过我喜欢。
输出总共T行,
每行输出两个整数,表示每个数字经过操作以后得出的数字M的最小值和最大值,用一个空格隔开
据说是暴搜找规律,写了两天暴搜,但这种新题型暴搜还不是很熟。
真的是代码量多了不会写,代码少了考思维也不会。太难过了。
暴搜:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define lch(x) tr[x].son[0] 12 #define rch(x) tr[x].son[1] 13 #define max3(a,b,c) max(a,max(b,c)) 14 #define min3(a,b,c) min(a,min(b,c)) 15 typedef pair<int,int> pll; 16 const int inf = 0x3f3f3f3f; 17 const LL INF = 0x3f3f3f3f3f3f3f3f; 18 const LL mod = (int)1e9+7; 19 const int N = 5e5 + 100; 20 int sta[N]; 21 int Max, gg; 22 void dfs(int b, int l, int lt, int cnt){ 23 if(lt == 0){ 24 Max = max(Max, l); 25 if(gg == l){ 26 for(int i = 1; i < cnt; ++i) 27 cout << sta[i] << ‘ ‘; 28 cout << endl; 29 } 30 } 31 for(int i = b; i <= lt; ++i){ 32 sta[cnt] = i; 33 dfs(i+1, l*i, lt-i, cnt+1); 34 } 35 } 36 int main(){ 37 int n; 38 while(cin >> n){ 39 gg = -1; 40 Max = 0; 41 dfs(1, 1, n, 1); 42 gg = Max; 43 dfs(1, 1, n, 1); 44 } 45 return 0; 46 }
正解:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define lch(x) tr[x].son[0] 12 #define rch(x) tr[x].son[1] 13 #define max3(a,b,c) max(a,max(b,c)) 14 #define min3(a,b,c) min(a,min(b,c)) 15 typedef pair<int,int> pll; 16 const int inf = 0x3f3f3f3f; 17 const LL INF = 0x3f3f3f3f3f3f3f3f; 18 const LL mod = (int)1e9+7; 19 const int N = 1e5 + 100; 20 LL Min[N], Max[N]; 21 vector<int> v; 22 void init(){ 23 v.pb(2); v.pb(3); 24 for(int i = 6; i <= 200; ++i){ 25 int t = v.size(); 26 if(v[0] != 2 && v[t-1] == v[t-2]+1) 27 ++v[t-1]; 28 else if(v[0] != 2){ 29 --v[t-1]; 30 v.insert(v.begin(), 2); 31 } 32 else { 33 int f = 1; 34 for(int i = t-2; i >= 0; i--){ 35 if(v[i]+1 != v[i+1]){ 36 ++v[i]; 37 f = 0; 38 break; 39 } 40 } 41 if(f) ++v[t-1]; 42 } 43 Min[i] = i-1; 44 Max[i] = 1; 45 for(int x : v){ 46 Max[i] *= x; 47 } 48 } 49 } 50 vector<int> vc; 51 int main(){ 52 int T, n; 53 scanf("%d", &T); 54 init(); 55 Min[1] = Max[1] = 1; 56 Min[2] = Max[2] = 2; 57 Min[3] = 2; Max[3] = 3; 58 Min[4] = 3; Max[4] = 4; 59 Min[5] = 4; Max[5] = 6; 60 while(T--){ 61 scanf("%d", &n); 62 printf("%lld %lld\n", Min[n], Max[n]); 63 } 64 return 0; 65 }
暴搜看懂了,会写了,但正解还没有看懂。
对于每一组样例
输出梓川咲太最大能够得到的分数
挖坑了qaq
好吧还是没懂。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define lch(x) tr[x].son[0] 12 #define rch(x) tr[x].son[1] 13 #define max3(a,b,c) max(a,max(b,c)) 14 #define min3(a,b,c) min(a,min(b,c)) 15 typedef pair<int,int> pll; 16 const int inf = 0x3f3f3f3f; 17 const LL INF = 0x3f3f3f3f3f3f3f3f; 18 const LL mod = (int)1e9+7; 19 const int N = 1e5 + 100; 20 int vis[N]; 21 void init(){ 22 for(int i = 2; i < N; ++i){ 23 for(int j = i+i, t = 2; j < N; j+=i, t++){ 24 vis[j] += t; 25 } 26 } 27 } 28 int main(){ 29 init(); 30 int n; 31 while(~scanf("%d", &n)){ 32 LL sum = 0; 33 for(int i = 2; i <= n; ++i){ 34 sum += vis[i]; 35 } 36 printf("%lld\n", sum*4+n-1); 37 } 38 return 0; 39 }
输出一个数字表示这个数列的和,由于答案可能很大,所以你需要将答案mod 123456789。
想出来了,应该是那种堆的感觉。大于的话就加在后面,小于的话就代替前面的。
最后就是爆 long long 了,不知道怎么做了。
(int128是什么,为什么我的两个编辑器都不能用!)
自我感觉良好,但是wa了的code:
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<map> 6 #include<algorithm> 7 #include<cmath> 8 using namespace std; 9 int c[501000], kk = 0; 10 int main() 11 { 12 int t; 13 cin >> t; 14 while (t--) 15 { 16 int n, m,b; 17 cin >> n >> m; 18 cin >> b; 19 c[++kk] = b; 20 for (int i = 2; i <= m; i++) 21 { 22 cin >> b; 23 if (b > c[kk]) 24 c[++kk] = b; 25 else 26 { 27 int tt = lower_bound(c+1,c+kk+1,b)-c; 28 c[tt] = b; 29 kk = tt; 30 } 31 } 32 int ans = 0; 33 for (int i = 2; i <= kk; i++) 34 { 35 int tt = c[i] - c[i - 1]; 36 tt = (tt * (tt + 1) % 123456789 * (2 * tt +1))/6% 123456789; 37 ans += tt; 38 ans = ans % 123456789; 39 } 40 int tt = n - c[kk] + 1; 41 tt = (tt * (tt + 1)% 123456789 * (2 * tt + 1)%123456789 )/6% 123456789; 42 ans += tt; 43 cout << ans%123456789 << endl; 44 } 45 46 return 0; 47 }
xk大佬ac的code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); 4 #define LL long long 5 #define ULL unsigned LL 6 #define fi first 7 #define se second 8 #define pb push_back 9 #define lson l,m,rt<<1 10 #define rson m+1,r,rt<<1|1 11 #define lch(x) tr[x].son[0] 12 #define rch(x) tr[x].son[1] 13 #define max3(a,b,c) max(a,max(b,c)) 14 #define min3(a,b,c) min(a,min(b,c)) 15 typedef pair<int,int> pll; 16 const int inf = 0x3f3f3f3f; 17 const LL INF = 0x3f3f3f3f3f3f3f3f; 18 const LL mod = 123456789; 19 const int N = 1e5 + 100; 20 int T; 21 int a[N]; 22 LL cal(int x){ 23 __int128 v = x; 24 v = v * (v+1) * (v*2+1)/6; 25 v %= mod; 26 return v; 27 } 28 int main(){ 29 scanf("%d", &T); 30 while(T--){ 31 int n, m; 32 scanf("%d%d", &n, &m); 33 LL ans = 0; 34 for(int i = 1; i <= m; ++i) 35 scanf("%d", &a[i]); 36 int lat = n+1; 37 for(int i = m; i >= 1; --i){ 38 if(lat <= a[i]) continue; 39 ans += cal(lat-a[i]); 40 ans %= mod; 41 lat = a[i]; 42 } 43 ans = (ans%mod)+mod; 44 ans %= mod; 45 printf("%lld\n", ans); 46 } 47 return 0; 48 }
输出一个数字,表示能取得的最大的总影响力
四种类型的排序。
原本wa的是因为,11都可以跟01/10/00都可以配。而我以为11只能跟00配对。
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<map> 6 #include<algorithm> 7 #include<cmath> 8 using namespace std; 9 int n, a[400100], b[400100], c[400100], d[400100], kk; 10 int k1 = 0, k2 = 0, k3 = 0, k4 = 0; 11 char s[5]; 12 bool cmp(int a, int b) 13 { 14 return a > b; 15 } 16 int main() 17 { 18 while (cin >> n) 19 { 20 memset(a, 0, sizeof(a)); 21 memset(b, 0, sizeof(b)); 22 memset(c, 0, sizeof(c)); 23 memset(d, 0, sizeof(d)); 24 k1 = 0; k2 = 0; 25 k3 = 0; k4 = 0; 26 for (int i = 1; i <= n; i++) 27 { 28 cin >> s; 29 cin >> kk; 30 if (s[0] == ‘1‘&&s[1] == ‘0‘) a[++k1] = kk; 31 else if (s[0] == ‘0‘&&s[1] == ‘1‘) b[++k2] = kk; 32 else if (s[0] == ‘0‘&&s[1] == ‘0‘) c[++k3] = kk; 33 else if (s[0] == ‘1‘&&s[1] == ‘1‘) d[++k4] = kk; 34 } 35 sort(a + 1, a + k1 + 1, cmp); 36 sort(b + 1, b + k2 + 1, cmp); 37 sort(c + 1, c + k3 + 1, cmp); 38 sort(d + 1, d + k4 + 1, cmp); 39 int ans = 0; 40 for (int i =1; i<=k4; i++) 41 ans += d[i]; 42 for (int i = 1; i <= min(k1, k2); i++) 43 ans += a[i] + b[i]; 44 //cout << ans << endl; 45 if (k1 > k2) 46 { 47 int tt = 0; 48 int xa = min(k1, k2) + 1, xc = 1; 49 while (tt <k4) 50 { 51 tt++; 52 if (a[xa] > c[xc]) 53 { 54 ans += a[xa]; 55 xa++; 56 } 57 else 58 { 59 ans += c[xc]; 60 xc++; 61 } 62 } 63 } 64 else 65 { 66 int tt = 0; 67 int xb = min(k1, k2) + 1, xc = 1; 68 while (tt < k4) 69 { 70 tt++; 71 if (b[xb] > c[xc]) 72 { 73 ans += b[xb]; 74 xb++; 75 } 76 else 77 { 78 ans += c[xc]; 79 xc++; 80 } 81 } 82 } 83 cout << ans << endl; 84 } 85 return 0; 86 }
这么长代码,比赛时我肯定自己先崩,不过不管那么多我还是A了。
原文:https://www.cnblogs.com/Kaike/p/10050820.html