Codeforces Round #158 (Div. 2) C题

来源:互联网 发布:2017年大学招生数据 编辑:程序博客网 时间:2024/04/30 00:54

有段时间没写博客了,今天更新一篇水水的解题报告吧


题意:有n个盒子,每个盒子有若干个球(ai>=0),然后把第i(1<=i<=n)盒子里把球全部拿出

来,然后将这些球一个一个的放进第i+1,i+2的盒子里,当放完第n个盒子的时候,则从令i=1,继

续往前放,直到拿出来的球全部放完为止,然后题目给出完成上述操作后各个盒子中的球数和最后

一次放球那个盒子的编号k(1<=k<=n),让你求原始各个盒子中的球数。


思路:这题YY了好久才做出来o(╯□╰)o    要求出原始序列,最重要的是求出球是从哪个盒子拿出

来的,而找这个盒子的方法是贪心,从第k个盒子往前找,k-1,k-2...k-i,若k-i==0,则再从第n个

盒子开始往前继续找,找出装球最小的那个盒子就是了。若最少球数盒子有多个,则选最快找到的那个

如样例

4 3

4 4 4 4

则第3个盒子是最先找到的而且是球数最少的,找到之后就好办了。。

//author Joy#pragma comment(linker, "/STACK:66777216")#include<math.h>#include<ctype.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>#include<iostream>#include<bitset>#include<vector>#include<queue>#include<stack>#include<list>#include<map>#include<set>#define LL long longusing namespace std;typedef struct coor{    int x,y;};int nomalDay[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年int leapDay[]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年const int ARRSIZE=100100;const int STRSIZE=100100;const int GRIDSIZE=510;const int MAXINF=(2<<20);const int MININF=(~(2<<20));inline bool upcmp(int a,int b){    return a<b;}inline bool downcmp(int a,int b){    return a>b;}//inline int getbit(int n)//{//return n==0?1:(int)log10(n)+1;//}/*--------------------分割线--------------------*/LL num[ARRSIZE];LL Min=2000000000;int main(){//freopen("input.txt", "r", stdin);//freopen("output.txt", "w", stdout);    int j,n,k,i,loc=0,idx;    cin>>n>>k;    for (i=1;i<=n;i++)        cin>>num[i];    for (i=k,j=0;j<n+1;j++,i--)    {        if (i==0)        {            i=n+1;            continue;        }        if (num[i]<Min)        {            loc=i;            Min=num[i];        }    }    for (i=1;i<=n;i++)        num[i]-=Min;    num[loc]=Min*n;    LL sum=0;    for (i=loc+1;i!=k+1;i++)    {        if (i==n+1)        {            i=0;            continue;        }        num[i]-=1;        sum++;    }    num[loc]+=sum;    for (i=1;i<=n;i++)        cout<<num[i]<<" ";    cout<<endl;    return 0;}




原创粉丝点击