HDU 5353 Average
2015-08-06 17:29
176 查看
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]的位置直接遍历那么得到的结果即为所求
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 --; 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 ){ p[A].a=1; a[1]--; p[A++].b=n; a ++; } if(a[1]<a ){ p[A].a=n; a --; p[A++].b=1; a[1]++; } return A; } int fun2(int pos){ if(n<3) return -1; int A=0; if(pos==1){ a ++; 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 ){ p[A].a=1; a[1]--; p[A++].b=n; a ++; } if(a[1]<a ){ p[A].a=n; a --; 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 ){ p[A].a=1; a[1]--; p[A++].b=n; a ++; } if(a[1]<a ){ p[A].a=n; a --; 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 ){ p[A].a=1; a[1]--; p[A++].b=n; a ++; } if(a[1]<a ){ p[A].a=n; a --; 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; }
相关文章推荐
- hdoj 1397 Goldbach's Conjecture (大数素数打表)
- 电源附近的电容的作用分析
- POJ 2391--Ombrophobic Bovines【拆点 && 二分 && 最大流dinic && 经典】
- Android 中怎样查找SELinux导致的权限受限问题
- Elasticsearch嵌套聚合
- Excel中宏使用小技巧
- [Erlang]Lager如何防止日志过载
- 去苹果浏览器默认样式
- 自定义ScrollView,实现ScrollView滑动监听并记录滑动位置。
- spring mongodb 修改内嵌list字段值
- String类常用方法
- 8.6省选模拟总结
- Word中行与行之间存在空白,而且删不掉的解决办法
- iOS 第二课 单例写法 本地存储登入登出 第三方缓冲圈
- 欢迎使用CSDN-markdown编辑器
- 去苹果浏览器默认样式
- Oracle数据库和Java的连接 需要添加Oracle自带的驱动\product\11.2.0\dbhome_1\jdbc\lib\jdbc6_g.jar文件
- 增加/删除 SWAP分区空间的方法
- 我是菜鸟:hadoop之mapreduce设计理念和基本架构
- Android自定义控件属性详解