hdu5353

模拟,,,

每个人有一些糖果,每两个人之间只能给一个糖果,问最后是否能让所有人的糖果数量相同,只要确定一个糖果的流向其他的就能够确定。

马虎了,卡了好几天,心塞塞的。。。

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;

const int maxa = 100005;
int biaoji[maxa];
int vis[maxa];
int put[maxa][2];
int ans(int a[], int n){
    int sta;
    int o = 0;
    for(int i =0;i < n; i++){
        if(a[i] > 0){
            sta = i;
            break;
        }
    }
    memset(vis, 0, sizeof(vis));
    int len = 0;
    int last = 0;
    for(int k = sta;; k++){
        if(len++ > n*3) break;
        int i = k % n;
        if(vis[i] == 1){
            last = 0;
            continue;
        }
        if(last == 1 && a[i] == 1){
            last = 0;
            continue;
        }
        if(a[i] > 0){
            last = 0;
            put[o][0] = i;
            put[o++][1] = (i+1)%n;
            vis[i] = 1;
            a[i] --, a[(i+1)%n] ++;
        }else if(a[i] < 0) last = 1;
    }
    /*for(int i =0 ;i < n; i++){
        printf("%d ", a[i]);
    }puts("");*/
    len = 0;
    last = 0;
    for(int i = sta; ; i--){
        i = (i%n+n*800)%n;
        if(len++ > n*3) break;
        if(vis[(i+n-1)%n] == 1)continue;
        if(a[i] > 0){
            put[o][0] = i;
            put[o++][1] = (i+n-1)%n;
            vis[(i+n-1)%n] = 1;
            a[i] --;
            a[(i-1+n)%n] ++;
        }
    }
    for(int i = 0;i < n; i++){
        if(a[i] != 0) return 0;
    }
    puts("YES");
    printf("%d\n", o);
    for(int i = 0;i  < o; i++){
        printf("%d %d\n", put[i][0]+1, put[i][1]+1);
    }return 1;
}
int ans1(int a[], int n){
    int sta;
    int o = 0;
    for(int i =0;i < n; i++){
        if(a[i] > 0){
            sta = i;
            break;
        }
    }
    memset(vis, 0, sizeof(vis));
    int len = 0;
    int last = 0;

    for(int i = sta; ; i--){
        i = (i%n+n)%n;
        if(last == 1 && a[i] == 1){
            last = 0;
            continue;
        }

        if(len++ > n*3) break;
        if(vis[(i+n-1)%n] == 1){
            last = 0;
            continue;
        }
        if(a[i] > 0){
            put[o][0] = i;
            put[o++][1] = (i+n-1)%n;
            vis[(i+n-1)%n] = 1;
            a[i] --;
            a[(i-1+n)%n] ++;
        }else if(a[i] < 0){
            last = 1;
        }
    }
    /*for(int i =0 ;i < n; i++){
        printf("%d ", a[i]);
    }puts("");*/
    len = 0;
    last = 0;
    for(int k = sta;; k++){
        if(len++ > n*3) break;
        int i = k % n;
        if(vis[i] == 1)continue;;
        if(a[i] > 0){
            last = 0;
            put[o][0] = i;
            put[o++][1] = (i+1)%n;
            vis[i] = 1;
            a[i] --, a[(i+1)%n] ++;
        }
    }
    for(int i = 0;i < n; i++){
        if(a[i] != 0) return 0;
    }
    puts("YES");
    printf("%d\n", o);
    for(int i = 0;i  < o; i++){
        printf("%d %d\n", put[i][0]+1, put[i][1]+1);
    }return 1;
}
int a[maxa], b[maxa], c[maxa];
int main(){
    int t;
    scanf("%d", &t);
    while(t--){
        memset(biaoji, 0, sizeof(biaoji));
        int n;
        scanf("%d", &n);
        long long sum = 0;
        int ok = 0;
        for(int i = 0;i < n; i++){
            scanf("%d", &a[i]);
            sum += a[i];
        }
        for(int i = 1; i < n; i++){
            if(a[i] != a[i-1]){
                ok = 1;
                break;
            }
        }
        int ook = 0;
        for(int i = 0;i  < n; i++){
            b[i] = a[i] - sum/n;
            c[i] = b[i];
            if(c[i] > 1)biaoji[i] = 1;
            else biaoji[i] = 0;
            if(b[i] > 2 || b[i] < -2) ook =1;
        }
        if(ok == 0){
            puts("YES\n0");
            continue;
        }
        if(sum % n != 0 || ook){
            puts("NO");
            continue;
        }
        if(ans(b, n));
        else if(ans1(c, n));
        else puts("NO");
    }
}
/*
5
6
2 0 0  2 0 2
8
3 0 0 3 0 2 0 0
8
3 0 0 3 0 0 2 0
8
0 0 3 3 0 0 2 0
8
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000001
*/

这是a过后花了二十分钟敲的不那么丑但依旧很丑的代码

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxa = 100005;
int put[maxa][2], vis[maxa];
int ans(int n, int a[]){
    int sta= 0;
    for(int i = 0;i < n; i++){
        if(a[i] > 0){
            sta = i;
        }
    }
    memset(vis, 0, sizeof(vis));
    int len = 0, last = 0, o =0 ;
    for(int i = sta; ;i++){
        i = i%n;
        if(len++ > 3*n) break;
        if(vis[i] == 1){
             last= 0;
             continue;
        }
        if(last == 1 && a[i] == 1){
            last = 0;
            continue;
        }
        if(a[i] > 0){
            vis[i] = 1;
            a[i] --, a[(i+1)%n] ++;
            put[o][0] = i;
            put[o][1] = (i+1)%n;
            o++;
        }else if(a[i] < 0){
            last = 1;
        }
    }
    len = 0, last = 0;
    for(int i = sta; ; i--){
        i = (i+n)%n;
        if(len++ > n*3) break;
        if(vis[(i+n-1)%n] == 1){
            last = 0;
            continue;;
        }
        if(last == 1 && a[i] == 1){
            last = 0;
            continue;
        }
        if(a[i] > 0){
            vis[(i+n-1)%n] = 1;
            a[i] --, a[(i+n-1)%n] ++;
            put[o][0] = i;
            put[o][1] = (i+n-1)%n;
            o++;
        }else if(a[i] < 0) last = 1;
    }
    for(int i =0 ; i< n; i++){
        if(a[i]) return 0;
    }
    puts("YES");
    printf("%d\n", o);
    for(int i = 0 ;i < o; i++){
        printf("%d %d\n", 1+put[i][0], 1+put[i][1]);
    }
    return 1;
}
int ans1(int n, int a[]){
    int sta= 0;
    for(int i = 0;i < n; i++){
        if(a[i] > 0){
            sta = i;
        }
    }
    memset(vis, 0, sizeof(vis));
    int len = 0, last = 0, o =0 ;
    for(int i = sta; ; i--){
        i = (i+n)%n;
        if(len++ > n*3) break;
        if(vis[(i+n-1)%n] == 1){
            last = 0;
            continue;;
        }
        if(last == 1 && a[i] == 1){
            last = 0;
            continue;
        }
        if(a[i] > 0){
            vis[(i+n-1)%n] = 1;
            a[i] --, a[(i+n-1)%n] ++;
            put[o][0] = i;
            put[o][1] = (i+n-1)%n;
            o++;
        }else if(a[i] < 0) last = 1;
    }
    len = 0, last = 0;
    for(int i = sta; ;i++){
        i = i%n;
        if(len++ > 3*n) break;
        if(vis[i] == 1){
             last= 0;;continue;
        }
        if(last == 1 && a[i] == 1){
            last = 0;
            continue;
        }
        if(a[i] > 0){
            vis[i] = 1;
            a[i] --, a[(i+1)%n] ++;
            put[o][0] = i;
            put[o][1] = (i+1)%n;
            o++;
        }else if(a[i] < 0){
            last = 1;
        }
    }
    for(int i =0 ; i< n; i++){
        if(a[i]) return 0;
    }
    puts("YES");
    printf("%d\n", o);
    for(int i = 0 ;i < o; i++){
        printf("%d %d\n", 1+put[i][0], 1+put[i][1]);
    }
    return 1;
}
int a[maxa], b[maxa], c[maxa];
int main(){
    int n, t;
    scanf("%d", &t);
    while(t--){
        scanf("%d", &n);
        long long sum = 0;
        for(int i = 0;i < n; i++){
            scanf("%d", &a[i]);
            sum += a[i];
        }
        if(sum % n){
            puts("NO"); continue;
        }
        for(int i = 0;i < n; i++){
            b[i] = a[i] - sum /n;
            c[i] = b[i];
        }
        if(ans(n, b)) ;
        else if(ans1(n, c));
        else puts("NO");
    }
}

时间: 2024-08-08 00:27:35

hdu5353的相关文章

hdu5353 Average(模拟)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Average Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1457    Accepted Submission(s): 360Special Judge Problem Description There ar

hdu5353||2015多校联合第六场1001 贪心

http://acm.hdu.edu.cn/showproblem.php?pid=5353 Problem Description There are n soda sitting around a round table. soda are numbered from 1 to n and i-th soda is adjacent to (i+1)-th soda, 1-st soda is adjacent to n-th soda. Each soda has some candies

[hdu5353]模拟

题意:有n个小朋友,每个小朋友手上有一些糖,考虑每两个相邻的小朋友a.b,可以选择执行3种操作中的任一种:(1)a给b一粒糖(2)b给a一粒糖(3)不进行任何动作,问能否通过确定每两个相邻的小朋友的操作使得最终每个人的糖果数量相等. 思路:如果只有1个小朋友,那么肯定是可行的,如果糖果数总和取模小朋友数不为0,那么肯定是不可行的.令第i个小朋友的糖果数为a[i],首先将平均值ave计算出来,然后a[i]=a[i]-ave.注意到a[i]的值是确定的,且每个a[i]到达的目标值也是确定的,也就是0

hdu5353(2015多校6)--Average(贪心)

题目链接:点击打开链接 题目大意:有n个人围城一个环,每一个人手里都有一些糖果,第i个人有ai块. 现在有三种操作: 第i个人给第i+1个人一块.如果i有 第i+1个人给第i个人一块.如果i+1有 什么都不做. 第i个人和第i+1个人之间,可以选择一种操作并执行,问最终能不能让所有人手里的糖相等. 当n = 1 时,永远是YES 当n = 2 时,注意1和2之间只能有一种操作,不存在循环. 当n > 2 时: 糖的总数不能均分到n个人手中,直接NO 可以分开,存在一个循环,那么枚举第1个人对第2

HDU5353:Average(贪心)

Problem Description There are n soda sitting around a round table. soda are numbered from 1 to n and i-th soda is adjacent to (i+1)-th soda, 1-st soda is adjacent to n-th soda. Each soda has some candies in their hand. And they want to make the numbe