• 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("
    ");
    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 }
  • 相关阅读:
    链表 | 递归删除不带头结点链表所有x元素
    A1016 | 磨人的大模拟
    Ubuntu 下安装 Qt Designer
    shell札记
    A1102 | 反转二叉树
    顺序表 | 二分查找:两个数组合并后的中位数
    A1113 | Integer Set Partition (25)
    A1128 | 逻辑想象能力、简洁高效美观的代码、memset的使用情景
    05.字符串
    04.序列的应用
  • 原文地址:https://www.cnblogs.com/xunzf0402/p/11930487.html
Copyright © 2020-2023  润新知