HDU 5353 Average

HDU 5353 Average

1001,纪念一下300多行的代码 ,今天的前一个小时做了这么一道题
可读性基本没有,太长了,说下思路吧
首先看糖的总数是否能被n整除,不能的话输出“NO”
接下来就是突破点:
1,每个人最多能进行两次操作,所以如果有一个人的糖果数比ave(平均数)多2以上或者ave比这个人的糖果数多2以上,直接输出“NO”
2,找到一个a[i](第i个人的糖果数),如果a[i]==ave+2 or a[i]=ave-2,那么可以将i的这个位置作为突破口向两边遍历找出结果
3,如果在忽略所有a[i]==ave的人的情况向如果有相邻的两个人的糖果数相等,且与ave的值差为1的话,那么可以直接一当前的两个相邻位置向两侧遍历找出结果
4,如果以上情况都没有发生,可以直接从a[1]的位置直接遍历那么得到的结果即为所求


#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#define ll __int64
#define INF 1e9
#define maxn 100005
using namespace std;
ll a[maxn];
int n;
ll ave;
struct node{
    int a,b;
}p[maxn];
int fun1(int pos){
    if(n<3) return -1;
    int A=0;
    if(pos==1){
        a[n]--;
        a[pos+1]--;
        a[pos]+=2;
        p[A].a=n;
        p[A++].b=pos;
        p[A].a=pos+1;
        p[A++].b=pos;
    }
    else if(pos==n){
        a[1]--;
        a[pos-1]--;
        a[pos]+=2;
        p[A].a=1;
        p[A++].b=pos;
        p[A].a=pos-1;
        p[A++].b=pos;
    }
    else{
        a[pos+1]--;
        a[pos-1]--;
        a[pos]+=2;
        p[A].a=pos+1;
        p[A++].b=pos;
        p[A].a=pos-1;
        p[A++].b=pos;
    }
    for(int i=pos+1;i<n;i++){
        if(a[i]==ave) continue;
        if(a[i]==ave+1){
            p[A].a=i;
            p[A++].b=i+1;
            a[i+1]++;
            a[i]--;
        }
        else if(a[i]==ave-1){
            p[A].a=i+1;
            p[A++].b=i;
            a[i+1]--;
            a[i]++;
        }
        else return -1;
    }
    for(int i=pos-1;i>1;i--){
        if(a[i]==ave) continue;
        if(a[i]==ave+1){
            p[A].a=i;
            p[A++].b=i-1;
            a[i-1]++;
            a[i]--;
        }
        else if(a[i]==ave-1){
            p[A].a=i-1;
            p[A++].b=i;
            a[i-1]--;
            a[i]++;
        }
        else return -1;
    }
    if(a[1]>a[n]){
        p[A].a=1;
        a[1]--;
        p[A++].b=n;
        a[n]++;
    }
    if(a[1]<a[n]){
        p[A].a=n;
        a[n]--;
        p[A++].b=1;
        a[1]++;
    }
    return A;
}
int fun2(int pos){
    if(n<3) return -1;
    int A=0;
    if(pos==1){
        a[n]++;
        a[pos+1]++;
        a[pos]-=2;
        p[A].a=pos;
        p[A++].b=n;
        p[A].a=pos;
        p[A++].b=pos+1;
    }
    else if(pos==n){
        a[1]++;
        a[pos-1]++;
        a[pos]-=2;
        p[A].a=pos;
        p[A++].b=1;
        p[A].a=pos;
        p[A++].b=pos-1;
    }
    else{
        a[pos+1]++;
        a[pos-1]++;
        a[pos]-=2;
        p[A].a=pos;
        p[A++].b=pos+1;
        p[A].a=pos;
        p[A++].b=pos-1;
    }
    for(int i=pos+1;i<n;i++){
        if(a[i]==ave) continue;
        if(a[i]==ave+1){
            p[A].a=i;
            p[A++].b=i+1;
            a[i+1]++;
            a[i]--;
        }
        else if(a[i]==ave-1){
            p[A].a=i+1;
            p[A++].b=i;
            a[i+1]--;
            a[i]++;
        }
        else return -1;
    }
    for(int i=pos-1;i>1;i--){
        if(a[i]==ave) continue;
        if(a[i]==ave+1){
            p[A].a=i;
            p[A++].b=i-1;
            a[i-1]++;
            a[i]--;
        }
        else if(a[i]==ave-1){
            p[A].a=i-1;
            p[A++].b=i;
            a[i-1]--;
            a[i]++;
        }
        else return -1;
    }
    if(a[1]>a[n]){
        p[A].a=1;
        a[1]--;
        p[A++].b=n;
        a[n]++;
    }
    if(a[1]<a[n]){
        p[A].a=n;
        a[n]--;
        p[A++].b=1;
        a[1]++;
    }
    return A;
}

int fun3(int pos){
    int A=0;
    for(int i=pos+1;i<n;i++){
        if(a[i]==ave) continue;
        if(a[i]==ave+1){
            p[A].a=i;
            p[A++].b=i+1;
            a[i]--;
            a[i+1]++;
        }
        else if(a[i]==ave-1){
            p[A].a=i+1;
            p[A++].b=i;
            a[i]++;
            a[i+1]--;
        }
        else return -1;
    }
    for(int i=pos;i>1;i--){
        if(a[i]==ave) continue;
        if(a[i]==ave+1){
            p[A].a=i;
            p[A++].b=i-1;
            a[i-1]++;
            a[i]--;
        }
        else if(a[i]==ave-1){
            p[A].a=i-1;
            p[A++].b=i;
            a[i-1]--;
            a[i]++;
        }
        else return -1;
    }
    if(a[1]>a[n]){
        p[A].a=1;
        a[1]--;
        p[A++].b=n;
        a[n]++;
    }
    if(a[1]<a[n]){
        p[A].a=n;
        a[n]--;
        p[A++].b=1;
        a[1]++;
    }
    return A;
}

int fun(){
    int A=0;
    for(int i=2;i<n;i++){
        if(a[i]==ave) continue;
        if(a[i]==ave+1){
            p[A].a=i;
            p[A++].b=i+1;
            a[i+1]++;
            a[i]--;
        }
        else if(a[i]==ave-1){
            p[A].a=i+1;
            p[A++].b=i;
            a[i+1]--;
            a[i]++;
        }
        else return -1;
    }
    if(a[1]>a[n]){
        p[A].a=1;
        a[1]--;
        p[A++].b=n;
        a[n]++;
    }
    if(a[1]<a[n]){
        p[A].a=n;
        a[n]--;
        p[A++].b=1;
        a[1]++;
    }
    return A;
}
void out(int m){
    printf("YES\n%d\n",m);
    for(int i=0;i<m;i++)
        printf("%d %d\n",p[i].a,p[i].b);
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        ll sum=0;
        for(int i=1;i<=n;i++){
            scanf("%I64d",&a[i]);
            sum+=a[i];
        }
        ll p1=-1,p2=-1,p3=-1,p4=-1,t=0;
        if(sum%n==0){
            ave=sum/n;
            int flag=0;
            for(int i=1;!flag&&i<=n;i++){
                if(a[i]<ave-2||a[i]>ave+2) flag=1;
                if(a[i]==ave-2) p1=i;
                if(a[i]==ave+2) p2=i;
                if(i&&a[i]==a[i-1-t]&&a[i]==ave-1) p3=i-1-t;
                if(i&&a[i]==a[i-1-t]&&a[i]==ave+1) p4=i-1-t;
                if(a[i]==ave) t++;
                else t=0;
            }
            int pos1=0,pos2=0;
            for(int i=1;i<=n;i++) if(a[i]!=ave) pos1=i;
            for(int i=n;i>=1;i--) if(a[i]!=ave) pos2=i;
            if(pos1&&pos1==pos2) flag=1;
            if(pos1&&a[pos1]==a[pos2]) p3=pos1;
            if(flag) printf("NO\n");
            else{
                int m;
                if(p1!=-1) m=fun1(p1);
                else if(p2!=-1) m=fun2(p2);
                else if(p3!=-1) m=fun3(p3);
                else if(p4!=-1) m=fun3(p4);
                else m=fun();
                for(int i=1;i<=n;i++) if(a[i]!=ave) m=-1;
                if(m==-1) printf("NO\n");
                else
                     out(m);
            }
        }
        else
            printf("NO\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值