您的位置:首页 > 其它

HDU 5353 Average 贪心

2015-08-08 11:20 337 查看
就是贪心啊,不知道为啥总是不过,总是WA

方法不对吗?

将数组扩展一倍,从左到右扫描,大于平均数就给右边的,小于就从右边拿,等于就不变,记录下操作类型。

大于2直接NO,不知道哪错了,自己出了一些数据也都过了

路过的大神多瞄一眼

多校每周只有两场,还是尽量把题全过了吧

#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define LL long long
#define INF 0x3f3f3f3f
#define MAXN 200005
using namespace std;
struct Node
{
int x, y;
Node(int x = 0, int y = 0):x(x), y(y){};
};
vector<Node> res;
int n;
LL sum;
LL a[MAXN];
int f[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif // OPEN_FILE
int T;
scanf("%d", &T);
for(int cas = 1; cas <= T; cas++){
scanf("%d", &n);
sum = 0;
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
a[i + n] = a[i];
sum += a[i];
}
if(sum % n != 0){
printf("NO\n");
continue;
}
LL ave = sum / n;
memset(f, 0, sizeof(f));
bool noans = false;
for(int i = 1; i < 2 * n; i++){
if(a[i] == ave){
continue;
}
if(a[i] < ave){
if(ave - a[i] > 2){
noans = true;
break;
}
a[i]++;
a[i + 1]--;
f[i] = 1;
continue;
}
if(a[i] > ave){
if(a[i] - ave > 2){
noans = true;
break;
}
a[i]--;
a[i + 1]++;
f[i] = -1;
}
}
if(noans){
printf("NO\n");
continue;
}
noans = true;
int cnt = 1;
int pos = 0;
for(int i = 2; i <= 2 * n; i++){
if(a[i] == a[i - 1]){
cnt++;
}
else{
cnt = 1;
}
if(cnt == n){
noans = false;
pos = i;
break;
}
}
if(noans){
printf("NO\n");
continue;
}
printf("YES\n");
int x, y;
res.clear();
for(int i = pos - n + 1; i <= pos; i++){
if(f[i] == 0){
continue;
}
if(f[i] == 1){
x = i + 1;
y = i;
}
else{
x = i;
y = i + 1;
}
if(x > n){
x -= n;
}
if(y > n){
y -= n;
}
res.push_back(Node(x, y));
}
printf("%d\n", res.size());
for(int i = 0; i < res.size(); i++){
printf("%d %d\n", res[i].x, res[i].y);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: