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;
}


posted @ 2015-08-08 11:26  buzhidaohahaha  阅读(165)  评论(0编辑  收藏  举报