#include <stdio.h>
#include <stdlib.h>
struct range {
int len;
int type;
};
char text[100001];
struct range ranges[50000];
int make_ranges(int n)
{
int r = 0;
int i = 0;
while (i < n && text[i] == '0')
i++;
if (i == n) {
ranges[r].len = n;
ranges[r].type = 0;
return 1;
} else if (i > 0) {
ranges[r].len = i;
ranges[r].type = 1;
r++;
}
ranges[r].len = 0;
for (; i < n; i++) {
if (text[i] == '0') {
ranges[r].len++;
} else if (ranges[r].len > 0) {
ranges[r].type = 2;
r++;
ranges[r].len = 0;
}
}
if (ranges[r].len > 0) {
ranges[r].type = 1;
r++;
}
return r;
}
int cmp(const void *a, const void *b)
{
struct range *ra = (struct range *)a;
struct range *rb = (struct range *)b;
return rb->len * ra->type - ra->len * rb->type;
}
void test(void)
{
int n, r;
int saved = 0;
int turns = 0;
int i;
scanf("%d%s", &n, text);
r = make_ranges(n);
qsort(ranges, r, sizeof(ranges[0]), cmp);
for (i = 0; i < r; i++) {
ranges[i].len -= turns * ranges[i].type;
while (ranges[i].len > 0 && ranges[i].type) {
ranges[i].len--;
ranges[i].type--;
turns++;
saved++;
if (ranges[i].type)
ranges[i].len--;
}
if (ranges[i].len > 0)
saved += ranges[i].len;
}
printf("%d\n", n - saved);
}
int main(void)
{
int t;
scanf("%d", &t);
while (t--)
test();
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <stdio.h> #include <stdlib.h> struct range { int len; int type; }; char text[100001]; struct range ranges[50000]; int make_ranges(int n) { int r = 0; int i = 0; while (i < n && text[i] == '0') i++; if (i == n) { ranges[r].len = n; ranges[r].type = 0; return 1; } else if (i > 0) { ranges[r].len = i; ranges[r].type = 1; r++; } ranges[r].len = 0; for (; i < n; i++) { if (text[i] == '0') { ranges[r].len++; } else if (ranges[r].len > 0) { ranges[r].type = 2; r++; ranges[r].len = 0; } } if (ranges[r].len > 0) { ranges[r].type = 1; r++; } return r; } int cmp(const void *a, const void *b) { struct range *ra = (struct range *)a; struct range *rb = (struct range *)b; return rb->len * ra->type - ra->len * rb->type; } void test(void) { int n, r; int saved = 0; int turns = 0; int i; scanf("%d%s", &n, text); r = make_ranges(n); qsort(ranges, r, sizeof(ranges[0]), cmp); for (i = 0; i < r; i++) { ranges[i].len -= turns * ranges[i].type; while (ranges[i].len > 0 && ranges[i].type) { ranges[i].len--; ranges[i].type--; turns++; saved++; if (ranges[i].type) ranges[i].len--; } if (ranges[i].len > 0) saved += ranges[i].len; } printf("%d\n", n - saved); } int main(void) { int t; scanf("%d", &t); while (t--) test(); } |
English