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 }
View Code

  直接推公式容易错,如果复杂度允许的话,使用一定的模拟去替换,比较不容易错。拿别人的代码,体会下这种感觉就好。

技术分享
 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 }
View Code

 

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

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)