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;
    }
  • 相关阅读:
    中位数
    two-strings-are-anagrams&&compare-strings&&longest-words
    第三次作业-------结对编程
    Git的基本使用方法和安装&心得体会(使用git命令行)
    第二次作业-----------结对项目之需求分析与原型设计
    使用Git进行代码管理心得------------个人练习
    Android开发环境的发展演变
    软件工程的实践项目的自我目标
    QT实现2048
    poj3723 Conscription
  • 原文地址:https://www.cnblogs.com/Accepting/p/12002591.html
Copyright © 2011-2022 走看看