骗子,说好的不要求最少步骤,可是为什么当一开始每个人的糖数和平均的一样数,操作数就必须为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;
}