题目链接:题目链接
题目大意:略
解题思路:模拟题(16分的天坑),16分的童鞋:关键在于,3 4 2; 3 3 4 3; 3 1 1; 观察这几组,最后一个学校的剩余的队伍的第一个队伍的第一个数据是致命点,如果是从其他学校转过来的计算开始,应该+1即可,而不是+2;如果是从当前学校转过来的计算开始,应该+2。
AC 代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { int n; while(~scanf("%d",&n)) { int a[n],b[n],cnt[n]={0},maxn=INT_MIN,flag=1; for(int i=0;i<n;i++) { scanf("%d",&a[i]); b[i]=a[i]; a[i]*=10; if(maxn<a[i]) maxn=a[i]; } if(n==1) // 1的特殊情况 { printf("#1\n"); int from=-1; for(int i=0;i<b[0];i++) { for(int j=0;j<10;j++) { if(j==0) printf("%d",from+=2); else printf(" %d",from+=2); } puts(""); } continue; } sort(b,b+n); if(b[n-1]==b[n-2]) flag=0; vector<int> v[n]; int last=1; int k=1,tmax=b[n-2]*10; for(int j=0;j<maxn;j++) { for(int i=0;i<n;i++) { if(a[i]>cnt[i]) { cnt[i]++; if(cnt[i]>tmax && flag==1) { if(last) // 高能!高能!16分的同学看过来,这里第一开始需要特殊处理,i.e. 3 3 1 3 3 4 3 3 4 2 { if(k-v[i][tmax-1]!=1) k--; last=0; } k++; v[i].push_back(k++); } else v[i].push_back(k++); } } } for(int i=0;i<n;i++) { printf("#%d\n",i+1); int count=0; for(int j=0;j<a[i];j++) { if(count==0) printf("%d",v[i][j]); else printf(" %d",v[i][j]); count++; if(count>=10) puts(""),count=0; } } } return 0; }