Codeforces Round #601 (Div. 2) D. Feeding Chicken

题目地址:http://codeforces.com/contest/1255/problem/D

题意:给k只鸡分米,地里有的有米有的没有米,所有鸡分的差值要最小,分的地要连起来才能算是一个集合的。

思路:遍历一遍地图即可,关键在于要弓字形的走,这样就能保证每只鸡的地在一起了。设米的总数为sum,则每只鸡可以分 sum/k 块有米的地。sum%k的均分就是了(这里看代码就懂了)。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 char s[63];
 8 void sol(){
 9     int r,c,k;
10     scanf("%d%d%d",&r,&c,&k);
11     char maps[101][101];
12     for(int i=0;i<r;i++)
13         scanf("%s",maps[i]);
14     int sum=0;
15     for(int i=0;i<r;i++)
16         for(int j=0;j<c;j++)
17             if(maps[i][j]=='R') sum++;
18     int a=0,b=0;
19     for(int i=0;i<r;i++){
20         if(i&1){
21             for(int j=0;j<c;j++){
22                 if(b+(maps[i][j]=='R')>((a<sum%k)?(sum/k+1):(sum/k))){      //先分sum%k个sum/k+1,剩下的分sum/k
23                     a++;
24                     maps[i][j]=s[a];
25                     b=1;
26                 }
27                 else{
28                     b+=(maps[i][j]=='R');   //每分到一块有米的地记录一下
29                     maps[i][j]=s[a];
30                 }
31             }
32         }
33         else{
34             for(int j=c-1;j>=0;j--){
35                 if(b+(maps[i][j]=='R')>((a<sum%k)?(sum/k+1):(sum/k))){
36                     a++;
37                     maps[i][j]=s[a];
38                     b=1;
39                 }
40                 else{
41                     b+=(maps[i][j]=='R');
42                     maps[i][j]=s[a];
43                 }
44             }
45         }
46     }
47     for(int i=0;i<r;i++){
48         for(int j=0;j<c;j++)
49             printf("%c",maps[i][j]);
50         printf("\n");
51     }
52 }
53 int main(){
54     int T;
55     cin>>T;
56     for(int i=0;i<62;i++){
57         if(i<26) s[i]=i+'a';
58         else if(i<52) s[i]=i-26+'A';
59         else s[i]=i-52+'0';
60     }
61     while(T--) sol();
62     return 0;
63 }

猜你喜欢

转载自www.cnblogs.com/xunzf0402/p/11930487.html