zoukankan      html  css  js  c++  java
  • L1-049. 天梯赛座位分配

    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。

    输入格式:

    输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。

    输出格式:

    从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。

    输入样例:

    3
    3 4 2
    

    输出样例:

    #1
    1 4 7 10 13 16 19 22 25 28
    31 34 37 40 43 46 49 52 55 58
    61 63 65 67 69 71 73 75 77 79
    #2
    2 5 8 11 14 17 20 23 26 29
    32 35 38 41 44 47 50 53 56 59
    62 64 66 68 70 72 74 76 78 80
    82 84 86 88 90 92 94 96 98 100
    #3
    3 6 9 12 15 18 21 24 27 30
    33 36 39 42 45 48 51 54 57 60

    2018年天梯赛的第一题,比赛的时候题目没看懂,可惜了。

    今天来补题也是不知道自己错在哪,一直有组数据过不了,后面参考了https://blog.csdn.net/moonlighttlj/article/details/79777016才AC。

    如果有什么数据欢迎指教~

    题目思路的话,其实就是按照题目的意思模拟,多注意写细节吧!

    20分代码:

    //Asimple
    #include <bits/stdc++.h>
    #define CLS(a, v) memset(a, v, sizeof(a))
    using namespace std;
    typedef long long ll;
    const ll maxn = 100 + 5;
    int n, m, res, ans, len, T, k, num, sum, t, cnt;
    vector<int> a[maxn];
    int b[maxn];
    bool vis[maxn];
    
    void input() {
        ios_base::sync_with_stdio(false);
        cin >> n;
        for(int i=0; i<n; i++) {
        	cin >> b[i];
        	sum += b[i]*10;
    	}
    	CLS(vis, false);
    	int cas = 1, man = 0;
    	while( sum -- ) {
    		for(int i=0; i<n; i++) {
    			if( a[i].size() < b[i]*10 ) {
    				a[i].push_back(cas);
    				if( man+1 == n ) cas += 2;
    				else cas += 1;
    			}
    			if ( vis[i]==false && a[i].size()>=b[i]*10 ) {
    				man ++;
    				vis[i] = true;
    			}
    		}
    	}
    	for(int i=0; i<n; i++) {
    		cout << "#" << i + 1 << endl;
    		for(int j=0; j<a[i].size(); j++) {
    			cout << a[i][j];
    			if( j%10 == 9 ) cout << "
    ";
    			else cout << " ";
    		}
    	}
    }
    
    int main(){
        input();
        return 0;
    }
    

      16分代码:

    感谢浙江中医药大学的同学提出的数据:

    3
    3 1 1

    4
    3 3 4 3
     
    代码还在改。。。。
    //Asimple
    #include <bits/stdc++.h>
    #define CLS(a, v) memset(a, v, sizeof(a))
    using namespace std;
    typedef long long ll;
    const ll maxn = 100 + 5;
    int n, m, res, ans, len, T, k, num, sum, t, cnt;
    vector<int> a[maxn];
    int b[maxn];
    
    void input() {
        ios_base::sync_with_stdio(false);
        cin >> n;
        for(int i=0; i<n; i++) {
        	cin >> b[i];
        	sum += b[i]*10;
    	}
    	int cas = 1, man = 0;
    	while( sum -- ) {
    		for(int i=0; i<n; i++) {
    			if( a[i].size() < b[i]*10 ) {
    				a[i].push_back(cas);
    				if( man+1 == n ) cas += 1;
    				else cas ++;
    			}
    		}
    		man = 0;
    		for(int i=0; i<n; i++) {
    			if( a[i].size() >= b[i]*10 ) man ++;
    		}
    		if( man +1 >= n ) cas += 1;
    	}
    	for(int i=0; i<n; i++) {
    		cout << "#" << i + 1 << endl;
    		for(int j=0; j<a[i].size(); j++) {
    			cout << a[i][j];
    			if( j%10 == 9 ) cout << "
    ";
    			else cout << " ";
    		}
    	}
    }
    
    int main(){
        input();
        return 0;
    }
    

      2018年4月4日改:

        20分AC,emmmm,感觉AC了终于知道题目的一些意思了。包括一些数据为什么是那个样子。

      每次分配人之后,先按之前的编号把下一个编号确定,然后再判断是不是只有最后一个队。真的有点坑。

    //Asimple
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll maxn = 100 + 5;
    int n, m, res, ans, len, T, k, num, sum, t, cnt;
    vector<int> a[maxn];
    int b[maxn];
    
    void input() {
        ios_base::sync_with_stdio(false);
        cin >> n;
        for(int i=0; i<n; i++) {
            cin >> b[i];
            sum += b[i]*10;
        }
        int cas = 1, man = 0;
        while( sum -- ) {
            for(int i=0; i<n; i++) {
                if( a[i].size() < b[i]*10 ) {
                    a[i].push_back(cas);
                    if( man+1 >= n ) cas += 2;
                    else cas ++;
                    man = 0;
                    for(int i=0; i<n; i++) {
                        if( a[i].size() >= b[i]*10 )
                            man ++;
                    }
                }
            }
        }
        for(int i=0; i<n; i++) {
            cout << "#" << i + 1 << endl;
            for(int j=0; j<a[i].size(); j++) {
                cout << a[i][j];
                if( j%10 == 9 ) cout << "
    ";
                else cout << " ";
            }
        }
    }
    
    int main(){
        input();
        return 0;
    }
  • 相关阅读:
    一些常用的代码评审工具
    Atlassian旗下一干team build软件
    Jira功能全介绍
    项目经验分享
    网址、下载地址
    Java 字节码解读
    Gitlab 安装
    博客园设置
    mybatis 遇到空串无法判断
    Shell 脚本入门
  • 原文地址:https://www.cnblogs.com/Asimple/p/8691323.html
Copyright © 2011-2022 走看看