zoukankan      html  css  js  c++  java
  • D. Feeding Chicken(构造)

    题目大意:将k个鸡放到一个n*m的矩阵中,要求每个鸡所占的rice的个数只差最小

    题解:构造,设一共有cnt个rice,可以分cnt/k个,即每一只鸡要么占用cnt/k个rice,要么占cnt/k+1个rice。蛇形跑一边矩阵即可。

    注意:要判断当前鸡的个数,即如果当前鸡的个数达到k个,那么放置完毕,鸡的数量不能再增长,而且剩下的格子一定是"."。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1E2+7;
    char arr[N][N];
    char mark[N][N];
    string s="1abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    void solve(){
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)   scanf("%s",arr[i]+1);
        int cnt=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(arr[i][j]=='R') cnt++;
        int x=cnt/k;
        int a=cnt%k;
        int pos=1;
        int sum=0;
        for(int i=1;i<=n;i++){
            if(i&1){
                for(int j=1;j<=m;j++){
                    if(arr[i][j]=='R'){
                        sum++;
                        if(pos<=k-a){
                            if(sum<x) mark[i][j]=s[pos];
                            else {
                                mark[i][j]=s[pos];
                                if(pos<k)
                                    pos++;
                                sum=0;
                            }
                        }
                        else {
                            if(sum<x+1) mark[i][j]=s[pos];
                            else {
                                mark[i][j]=s[pos];
                                if(pos<k)
                                    pos++;
                                sum=0;
                            }
                        }
                    }
                    else mark[i][j]=s[pos];
                }
            }
            else {
                 for(int j=m;j>=1;j--){
                    if(arr[i][j]=='R'){
                        sum++;
                        if(pos<=k-a){
                            if(sum<x) mark[i][j]=s[pos];
                            else {
                                mark[i][j]=s[pos];
                                if(pos<k) pos++;
                                sum=0;
                            }
                        }
                        else {
                            if(sum<x+1) mark[i][j]=s[pos];
                            else {
                                mark[i][j]=s[pos];
                                if(pos<k) pos++;
                                sum=0;
                            }
                        }
                    }
                    else mark[i][j]=s[pos];
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                printf("%c",mark[i][j]);
            }
            printf("
    ");
        }
    }
    int main(){
        int t;
        scanf("%d",&t);
        while(t--) solve();
        return 0;
    }
  • 相关阅读:
    hdu 2680 最短路径(dijkstra算法+多源最短路径单源化求最小值)
    kmp算法
    STP根交换机,指定端口,根端口,阻塞端口
    python,django安装
    交换机access与trunk口
    树状数组
    hdoj 2191(多重背包)
    hdoj 2601(判断N=i*j+i+j)
    二维背包经典问题
    hdoj 2602(背包)
  • 原文地址:https://www.cnblogs.com/Accepting/p/12002591.html
Copyright © 2011-2022 走看看