hdu 5353
骗子,说好的不要求最少步骤,可是为什么当一开始每个人的糖数和平均的一样数,操作数就必须为0呢?
(大早晨起来就没电了,中午得去买点,手机还得充电,又不然快递来了,和上次一样,接不到电话,不过,早晨吃的牛肉馅包子真好吃!!!!!!)
2015.8.29:
对于这道题,一开始的混淆点是:
1.读错题了,以为每个人可以给相邻的人多块糖。
2.读对题后,如果确定1对2没操作后,2对1的操作不能确定,这只能说明脑子抽了,1对2没操作,2当然也是对1没操作,
感觉这道题就是当不知道对错时,又没有充足的数据判断时,先试着做一遍,不行再换种方法。
(最近几天起得晚,都没有碰上牛肉包子,去的时候包子都凉了,不好吃了)
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define N 100010 long long int ccou[N]; long long int avecou[N]; bool bl(int n,int temp,long long int *stepnum){ (*stepnum)=0; if(n==1){ return true; } if(temp!=0){ (*stepnum)++; } avecou[1]-=temp; avecou[2]+=temp; for(int i=2;i<n;i++){ if(avecou[i]>1||avecou[i]<-1){ return false; } else{ if(avecou[i]==1){ avecou[i]--; avecou[i+1]++; (*stepnum)++; } else if(avecou[i]==-1){ avecou[i]++; avecou[i+1]--; (*stepnum)++; } } } if(avecou[n]>1||avecou[n]<-1){ return false; } else if(avecou[n]==1){ avecou[n]--; avecou[1]++; (*stepnum)++; } else if(avecou[n]==-1){ avecou[n]++; avecou[1]--; (*stepnum)++; } if(avecou[1]==0){ return true; } else{ return false; } } bool init(long long int sum,int n){ long long int avenum=sum/n; for(int i=1;i<=n;i++){ avecou[i]=ccou[i]-avenum; if(avecou[i]>2||avecou[i]<-2){ return false; } } return true; } void zfprint(int n,int temp,long long int stepnum){ printf("YES\n"); printf("%lld\n",stepnum); if(n==1){ return; } if(temp==1){ printf("%d %d\n",1,2);//注意n可能为1 } else if(temp==-1){ printf("%d %d\n",2,1); } avecou[1]-=temp; avecou[2]+=temp; for(int i=2;i<n;i++){ if(avecou[i]==1){ printf("%d %d\n",i,i+1); avecou[i]--; avecou[i+1]++; } else if(avecou[i]==-1){ printf("%d %d\n",i+1,i); avecou[i]++; avecou[i+1]--; } } if(avecou[n]==1){ printf("%d %d\n",n,1); } else if(avecou[n]==-1){ printf("%d %d\n",1,n); } return; } bool allzero(int n){ for(int i=1;i<=n;i++){ if(avecou[i]){ return false; } } return true; } int main(){ int t; int n; long long int sum; bool pd; long long int stepnum; scanf("%d",&t); while(t--){ scanf("%d",&n); sum=0; for(int i=1;i<=n;i++){ scanf("%lld",&ccou[i]); sum+=ccou[i]; } if(sum%n){ printf("NO\n"); } else{ if(!init(sum,n)){ printf("NO\n"); } else if(allzero(n)){ printf("YES\n"); printf("0\n"); } else{ if(bl(n,1,&stepnum)){ init(sum,n); zfprint(n,1,stepnum); } else if(init(sum,n),bl(n,0,&stepnum)){ init(sum,n); zfprint(n,0,stepnum); } else if(init(sum,n),bl(n,-1,&stepnum)){ init(sum,n); zfprint(n,-1,stepnum); } else{ printf("NO\n"); } } } } return 0; }