Codeforces Round #392 (Div. 2)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #392 (Div. 2)相关的知识,希望对你有一定的参考价值。
A - Holiday Of Equality(water)
题意:
一共给你N个数,让你向上补数值,使得最终所有数值都相等,输出最少花费。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int INF = 0x3f3f3f3f; 5 const int maxn = 100 + 5; 6 7 int a[maxn]; 8 9 int main() 10 { 11 int n; 12 scanf("%d", &n); 13 int maxx = -INF; 14 for(int i = 0; i <n; i++) 15 { 16 scanf("%d", &a[i]); 17 if(a[i] > maxx) maxx = a[i]; 18 } 19 int sum = 0; 20 for(int i = 0; i < n; i++) 21 { 22 sum += maxx - a[i]; 23 } 24 cout << sum << endl; 25 return 0; 26 }
B - Blown Garland(杂?)
题意:
一共有四种颜色的灯RBYG,现在有!处表示这个位子的灯泡坏掉了,我们现在需要在!处放置四种颜色的灯泡,使得最终的序列,保证每连续的四个灯泡都具有四种不同的颜色。问我们需要添加多少个R,B,Y,G.保证答案唯一。
思路:
神特么这题一开始卡住不知道怎么写好。然后抓着前四个点确定,则整串都确定的特点。。直接几个for一套暴力掉了,反正没多大。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int INF = 0x3f3f3f3f; 5 const int maxn = 100 + 5; 6 7 char s[maxn], ss[maxn]; 8 int vis[10]; 9 int r,y,g,b; 10 char p[] = {‘R‘, ‘B‘, ‘Y‘, ‘G‘}; 11 12 void solve(char ss[]) 13 { 14 for(int i = 4; i < strlen(s); i++) 15 { 16 ss[i] = ss[i - 4]; 17 } 18 int cntr = 0, cnty = 0, cntg = 0, cntb = 0; 19 for(int i = 0; i < strlen(s); i++) 20 { 21 if(s[i] != ‘!‘) 22 { 23 if(s[i] != ss[i]) 24 { 25 return; 26 } 27 } 28 else 29 { 30 if(ss[i] == ‘R‘) cntr++; 31 else if(ss[i] == ‘Y‘) cnty ++; 32 else if(ss[i] == ‘G‘) cntg++; 33 else if(ss[i] == ‘B‘) cntb++; 34 } 35 } 36 r = cntr, y = cnty, g = cntg, b = cntb; 37 } 38 39 int main() 40 { 41 scanf("%s", s); 42 r = 0, b = 0, y = 0, g = 0; 43 for(int i = 0; i < 4; i++) 44 { 45 for(int j = 0; j < 4; j++) 46 { 47 for(int k = 0; k < 4; k++) 48 { 49 for(int l = 0; l < 4; l++) 50 { 51 ss[0] = p[i], ss[1] = p[j], ss[2] = p[k], ss[3] = p[l]; 52 solve(ss); 53 } 54 } 55 } 56 } 57 cout << r << " " << b << " " << y << " " << g << endl; 58 return 0; 59 }
其实可以这样想,任意四个点确定,则整个序列确定,那么对于i%4来说,余数相同的位置的颜色必然相同啊。= =。╮(╯▽╰)╭真是撒比lity。
1 #include <bits/stdc++.h> 2 using namespace std; 3 char ch[128]; 4 int cnt[5]; 5 int main() 6 { 7 char s[105]; 8 scanf("%s", s); 9 int len = strlen(s); 10 for(int i = 0; i < len; i++) 11 { 12 if(s[i] != ‘!‘) 13 { 14 ch[s[i]] = i % 4; 15 } 16 } 17 18 for(int i = 0; i < len; i++) 19 { 20 if(s[i] == ‘!‘) cnt[i % 4]++; 21 } 22 printf("%d %d %d %d\n", cnt[ch[‘R‘]], cnt[ch[‘B‘]], cnt[ch[‘Y‘]], cnt[ch[‘G‘]]); 23 return 0; 24 }
C - Unfair Poll(数学)
题意:
教室里有n列m排,老师上课点名从第一列第一排开始往后点,直到点到第一列第m排,就从第二列第一排开始点,当点完第n列的名之后,接着点第n-1列的名。以此类推,就是从列上来看的话:1,2,3,4,……,n,n-1,n-2,……,1,2,……。这样的顺序点名。老师上课总共点k次名,问该课堂最多可以点同一个同学多少次,最少可以点同一个同学多少次,点了位置为(x,y)的同学多少次名。
思路:
直接推公式的做法:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const int INF = 0x3f3f3f3f; 5 const int maxn = 100 + 5; 6 7 LL n, m, k, x, y; 8 9 int main() 10 { 11 LL maxx = 0, minn = INF, special = 0; 12 cin >> n >> m >> k >> x >> y; 13 if(n == 1) 14 { 15 LL times = k / m; 16 LL mod = k % m; 17 maxx = times + (mod != 0); 18 minn = times; 19 special = times + (y <= mod); 20 } 21 else if(n == 2) 22 { 23 LL times = k / (2 * m); 24 LL mod = k % (2 * m); 25 maxx = times + (mod != 0); 26 minn = times; 27 special = times + ((x - 1) * m + y <= mod); 28 } 29 else 30 { 31 if(k <= n * m) 32 { 33 maxx = 1; 34 minn = ((n * m) == k); 35 if((x - 1) * m + y <= k) 36 { 37 special = 1; 38 } 39 } 40 else 41 { 42 LL times = k / ((2 * n - 2) * m); 43 LL mod = k % ((2 * n - 2) * m); 44 if(mod > n * m) 45 { 46 minn = times + 1; 47 maxx = 2 * times + 2; 48 if(x == 1 || x == n) 49 { 50 special = times + 1; 51 } 52 else 53 { 54 special = times * 2 + 1 + (( (n - 1 - x) * m + y ) <= (mod - n * m)); 55 } 56 } 57 else 58 { 59 minn = times + (mod == (n * m)); 60 maxx = 2 * times + (mod > m); 61 if(x == 1 || x == n) 62 { 63 special = times +( ( (x - 1) * m + y ) <= (mod) ); 64 } 65 else 66 { 67 special = times * 2 + (( (x - 1) * m + y ) <= (mod)); 68 } 69 } 70 } 71 } 72 cout << maxx << " " << minn << " " << special << endl; 73 return 0; 74 }
直接推公式容易错,如果复杂度允许的话,使用一定的模拟去替换,比较不容易错。拿别人的代码,体会下这种感觉就好。
1 int main(void) 2 { 3 int i, j; 4 cin>>n>>m>>k>>x>>y; 5 if(n==1) 6 { 7 for(i=1 ; i<=n ; i++) 8 { 9 for(j=1 ; j<=m ; j++) 10 { 11 val[i][j]+=k/m; 12 } 13 } 14 k%=m; 15 for(i=1 ; i<=n ; i++) 16 { 17 for(j=1 ; j<=k ; j++) 18 { 19 val[i][j]++; 20 } 21 } 22 } 23 else 24 { 25 for(i=1 ; i<=n ; i++) 26 { 27 for(j=1 ; j<=m ; j++) 28 { 29 val[i][j]+=k/((2*n-2)*m); 30 if(i!=1 && i!=n) 31 { 32 val[i][j]+=k/((2*n-2)*m); 33 } 34 } 35 } 36 k=k%((2*n-2)*m); 37 for(i=1 ; i<=n ; i++) 38 { 39 for(j=1 ; j<=m ; j++) 40 { 41 if(k>0) 42 { 43 val[i][j]++; 44 k--; 45 } 46 } 47 } 48 for(i=n-1 ; i>=1 ; i--) 49 { 50 for(j=1 ; j<=m ; j++) 51 { 52 if(k>0) 53 { 54 val[i][j]++; 55 k--; 56 } 57 } 58 } 59 } 60 for(i=1 ; i<=n ; i++) 61 { 62 for(j=1 ; j<=m ; j++) 63 { 64 ansf=max(ansf,val[i][j]); 65 anss=min(anss,val[i][j]); 66 } 67 } 68 cout<<ansf<<" "<<anss<<" "<<val[x][y]; 69 }
D - Ability To Convert
题意:
给出一个进制数n,还有一个值,是数字k在n进制下的值,求k的最小值。
以上是关于Codeforces Round #392 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #392 (Div. 2) F. Geometrical Progression
Codeforces Round #392 (Div. 2)
Codeforces Round #392 (Div. 2)
Codeforces Round #392 (div.2) E:Broken Tree