hdu 5353

来源:互联网 发布:淘宝电钢琴 编辑:程序博客网 时间:2024/05/16 12:50

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


0 0
原创粉丝点击