HDU 5353
来源:互联网 发布:手机二次元壁纸软件 编辑:程序博客网 时间:2024/06/05 18:14
有n个人围成一圈,每个人有ai个糖果,每个人可以给相邻的人一个,问最后是否能使每个人都得到相等的糖果。
讨论三种情况
1 给 2
2 给 1
1 ,2 不相互给,
接下来从 2 到 n-1 如果 a[i]>平均值则给下一个人一个,如果a[i]<平均值,则从下一个人得到一个,最后讨论 1和n的关系
讨论三种情况
1 给 2
2 给 1
1 ,2 不相互给,
接下来从 2 到 n-1 如果 a[i]>平均值则给下一个人一个,如果a[i]<平均值,则从下一个人得到一个,最后讨论 1和n的关系
特判,当所有数都相等时 ;
#include<bits/stdc++.h>using namespace std;const int maxn = 100005;int a[maxn];int b[maxn];int c[maxn];int ans[maxn*2+10];int main(){ int T ; scanf("%d", &T); while(T--) { int n; scanf("%d", &n ); long long sum = 0; int fl=0; for(int i = 1; i <= n; i++) { scanf("%d",&a[i]); if(i>1&&a[i]!=a[i-1]) { fl=1; } b[i]=c[i]=a[i]; sum +=a[i]; } if(a[n]!=a[1]) { fl=1; } if(!fl) { printf("YES\n"); printf("0\n"); continue; } if(sum%n) { printf("NO\n"); continue; } int flag=0; int ave = sum / n; a[1]--; a[2]++; int k = 1; ans[k++]=1; ans[k++]=2; for( int i = 2; i<= n-1; i++) { if(a[i]>ave) { a[i]--; a[i+1]++; ans[k++]=i; ans[k++]=i+1; if(a[i] != ave) { flag=1; break; } } else if(a[i] < ave) { a[i]++; a[i+1]--; if(a[i]!=ave) { flag=1; break; } ans[k++]=i+1; ans[k++]=i; } } if(a[n]>a[1]&&!flag) { a[n]--; a[1]++; ans[k++]=n; ans[k++]=1; } else if(a[n]<a[1]) { a[n]++; a[1]--; ans[k++]=1; ans[k++]=n; } if(a[n]!= ave|| a[1]!= ave ) { flag=1; } if(!flag) { printf("YES\n"); printf("%d\n",k/2); for(int i = 1; i < k; i+=2) { printf("%d %d\n",ans[i],ans[i+1]); } continue; } flag=0; b[1]++; b[2]--; k=1; ans[k++]=2; ans[k++]=1; for( int i = 2; i<= n-1; i++) { if(b[i]>ave) { b[i]--; b[i+1]++; ans[k++]=i; ans[k++]=i+1; if(b[i] != ave) { flag=1; break; } } else if(b[i] < ave) { b[i]++; b[i+1]--; if(b[i]!=ave) { flag=1; break; } ans[k++]=i+1; ans[k++]=i; } } if(b[n]>b[1]) { b[n]--; b[1]++; ans[k++]=n; ans[k++]=1; } else if(b[n]<b[1]) { b[n]++; b[1]--; ans[k++]=1; ans[k++]=n; } if(b[n]!= ave|| b[1]!= ave ) { flag=1; } if(!flag) { printf("YES\n"); printf("%d\n",k/2); for(int i = 1; i < k; i+=2) { printf("%d %d\n",ans[i],ans[i+1]); } continue; } k=1; flag=0; for( int i = 2; i<= n-1; i++) { if(c[i]>ave) { c[i]--; c[i+1]++; ans[k++]=i; ans[k++]=i+1; if(c[i] != ave) { flag=1; break; } } else if(c[i] < ave) { c[i]++; c[i+1]--; if(c[i]!=ave) { flag=1; break; } ans[k++]=i+1; ans[k++]=i; } } if(c[n]>c[1]) { c[n]--; c[1]++; ans[k++]=n; ans[k++]=1; } else if(c[n]<c[1]) { c[n]++; c[1]--; ans[k++]=1; ans[k++]=n; } if(c[n]!= ave|| c[1]!= ave ) { flag=1; } if(!flag) { printf("YES\n"); printf("%d\n",k/2); for(int i = 1; i < k; i+=2) { printf("%d %d\n",ans[i],ans[i+1]); } continue; } else { printf("NO\n"); } } return 0;}
0 0
- hdu 5353
- HDU 5353
- HDU 5353 Average
- HDU 5353 Average
- HDU 5353 Average
- HDU 5353 Average(枚举)
- HDU 5353 Average 贪心
- HDU 5353 模拟
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- json格式字符串转集合
- TFS客户端接口详解JAVA版本
- vijos - P1456最小总代价 (状态压缩DP + 记忆化搜索)
- Memset()函数综合分析
- BZOJ1057
- HDU 5353
- 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
- C# List排序
- solr管理配置,关于数据导入,集群复制及日志配置
- Android四大基本组件与生命周期的详细介绍
- .NET学习笔记
- iOS开发(Objective-C)常用库索引
- 1688 Sightseeing(最短路+次短路+计数)
- [android]状态栏的电量图标变化代码流程