题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=6557
先找规律发现1有2个时满足条件,2有4个时满足条件,3有8个时满足条件,故每个数字若不等于前一个时,则需还需要的个数一直*2,直到等于当前数
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
typedef struct {
int num;
int id;
}Node;
Node a[N];
int vis[N];
int cmp(Node a1, Node a2) {
return a1.num < a2.num;
}
int main() {
int T;
scanf("%d", &T);
int n;
int ex = 0;
while (T--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i].num);
a[i].id = i;
vis[i] = 0;
}
LL cnt1=1, cnt2=1;
int pre = 1;
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++) {
while ((cnt1 + cnt2 <= n - i + 1) && pre < a[i].num) {
cnt1 *= 2;
cnt2 *= 2;
pre++;
}
if (cnt1 + cnt2 > n - i + 1)break; //所需个数超过剩下的个数
if (cnt1) {
vis[a[i].id] = 1;
cnt1--;
}
else cnt2--;
if (cnt1 == 0 && cnt2 == 0)break;
}
if (cnt1 || cnt2) {
printf("Case %d: NO\n", ++ex);
}
else {
printf("Case % d: YES\n", ++ex);
for (int i = 1; i <= n; i++)
printf("%d", vis[i]);
printf("\n");
}
}
return 0;
}