codeforces723c

来源:互联网 发布:java代码如何打包tar 编辑:程序博客网 时间:2024/06/01 23:35

这个就是代码问题,主要是脑速问题,想的代码实现还是很复杂,导致这个容易出bug以及一晚上都在调试。。。。gg
就是不断的去比如果个数小于n/m的话,找大于n/m或者大于m的换就行了

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MaxN = 1e9+5;int a[2010] , sum[2010] , change[2010] , xu[2010];int n , m ;int main(){    int _min , ans = 0;    scanf("%d %d", &n , &m);    _min = n / m;    int Max = 0;    for(int i = 0 ; i < n ; i++){        scanf("%d",&a[i]);        if(a[i] <= m)sum[a[i]]++;        if(a[i] > Max) Max = a[i];    }    for(int i = 1 ; i <= m ; i++){        xu[i] = _min - sum[i];        if(sum[i] < _min && xu[i] > 0)           ans += xu[i];        //printf("xu[%d] = %d ,%d\n",i,xu[i],ans);    }    //printf("ans = %d\n",ans);    int num = 0, j = 0;    for(int i = 0 ; i < n ; i++){        int flag = 0;        if(a[i] <= m && xu[a[i]] < 0) flag = 1;        if(flag || a[i] > m){             // printf("*\n");              while(xu[j] <= 0 && j < m){                  j++;              }              //printf("j = %d\n",j);              if(xu[j] > 0){                 //printf("%d ti %d\n",i,j);                 xu[j]--;                 //printf("xu[%d] = %d\n",j,xu[j]);                 if(flag) xu[a[i]]++;                 a[i] = j;                 num++;              }           }    }    printf("%d %d\n", _min , ans);    for(int i = 0 ; i < n - 1 ; i++)        printf("%d ",a[i]);    printf("%d\n",a[n - 1]);    return 0;}
0 0
原创粉丝点击