HDU 5353 Average 贪心
2016-01-06 15:37
399 查看
就是贪心啊,不知道为啥总是不过,总是WA
方法不对吗?
将数组扩展一倍,从左到右扫描,大于平均数就给右边的,小于就从右边拿,等于就不变,记录下操作类型。
大于2直接NO,不知道哪错了,自己出了一些数据也都过了
路过的大神多瞄一眼
多校每周只有两场,还是尽量把题全过了吧
方法不对吗?
将数组扩展一倍,从左到右扫描,大于平均数就给右边的,小于就从右边拿,等于就不变,记录下操作类型。
大于2直接NO,不知道哪错了,自己出了一些数据也都过了
路过的大神多瞄一眼
多校每周只有两场,还是尽量把题全过了吧
1 #pragma comment(linker, "/STACK:102400000,102400000") 2 #include <iostream> 3 #include <cstdio> 4 #include <fstream> 5 #include <algorithm> 6 #include <cmath> 7 #include <deque> 8 #include <vector> 9 #include <queue> 10 #include <string> 11 #include <cstring> 12 #include <map> 13 #include <stack> 14 #include <set> 15 #define LL long long 16 #define INF 0x3f3f3f3f 17 #define MAXN 200005 18 using namespace std; 19 struct Node 20 { 21 int x, y; 22 Node(int x = 0, int y = 0):x(x), y(y){}; 23 }; 24 vector<Node> res; 25 int n; 26 LL sum; 27 LL a[MAXN]; 28 int f[MAXN]; 29 int main() 30 { 31 #ifndef ONLINE_JUDGE 32 freopen("in.txt", "r", stdin); 33 //freopen("out.txt", "w", stdout); 34 #endif // OPEN_FILE 35 int T; 36 scanf("%d", &T); 37 for(int cas = 1; cas <= T; cas++){ 38 scanf("%d", &n); 39 sum = 0; 40 for(int i = 1; i <= n; i++){ 41 scanf("%d", &a[i]); 42 a[i + n] = a[i]; 43 sum += a[i]; 44 } 45 if(sum % n != 0){ 46 printf("NO\n"); 47 continue; 48 } 49 LL ave = sum / n; 50 memset(f, 0, sizeof(f)); 51 bool noans = false; 52 for(int i = 1; i < 2 * n; i++){ 53 if(a[i] == ave){ 54 continue; 55 } 56 if(a[i] < ave){ 57 if(ave - a[i] > 2){ 58 noans = true; 59 break; 60 } 61 a[i]++; 62 a[i + 1]--; 63 f[i] = 1; 64 continue; 65 } 66 if(a[i] > ave){ 67 if(a[i] - ave > 2){ 68 noans = true; 69 break; 70 } 71 a[i]--; 72 a[i + 1]++; 73 f[i] = -1; 74 } 75 } 76 if(noans){ 77 printf("NO\n"); 78 continue; 79 } 80 noans = true; 81 int cnt = 1; 82 int pos = 0; 83 for(int i = 2; i <= 2 * n; i++){ 84 if(a[i] == a[i - 1]){ 85 cnt++; 86 } 87 else{ 88 cnt = 1; 89 } 90 if(cnt == n){ 91 noans = false; 92 pos = i; 93 break; 94 } 95 } 96 if(noans){ 97 printf("NO\n"); 98 continue; 99 } 100 printf("YES\n"); 101 int x, y; 102 res.clear(); 103 for(int i = pos - n + 1; i <= pos; i++){ 104 if(f[i] == 0){ 105 continue; 106 } 107 if(f[i] == 1){ 108 x = i + 1; 109 y = i; 110 } 111 else{ 112 x = i; 113 y = i + 1; 114 } 115 if(x > n){ 116 x -= n; 117 } 118 if(y > n){ 119 y -= n; 120 } 121 res.push_back(Node(x, y)); 122 } 123 printf("%d\n", res.size()); 124 for(int i = 0; i < res.size(); i++){ 125 printf("%d %d\n", res[i].x, res[i].y); 126 } 127 } 128 }
相关文章推荐
- HDU 5358 First One 数学+尺取法
- Altium Desiger原理图编号更改方法
- Mybatis数据源配置
- HDU 4372 Count the Buildings 组合数学
- HDU 4349 Xiao Ming's Hope 组合数学
- HDU 4358 Boring counting dfs序+莫队算法
- 在SublimeText上搭建ReactJS开发环境
- 暑假集训-合训第九场
- C++ BigInteger模板
- PHP写文件到指定位置
- 多校-HDU 5351 MZL's Border 数学规律
- 一些资料
- 图解HTTPS
- android-事件分发:弹性滑动、滑动冲突等
- 邮件的发送与接收原理
- 我们一起学python-helloworld2
- 串口通信参数
- Google Map开发系列(九)——GMap2可以有哪些设置项
- android学习笔记——android动画Animation的讲解
- 本地使用js或jquery操作cookie在谷歌浏览器chrome中不生效