有段时间没写博客了,今天更新一篇水水的解题报告吧
题意:有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 long
using 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;
}