A, B ...
C
想好思路,恶搞
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m;
int c[3];
char s[3];
int ans[1003][1003];
void out() {
int i, j;
for(i = 0; i < n; i++, puts(""))
for(j = 0; j < m; j++)
printf("%02d ", ans[i][j]);
}
int main() {
int i, j;
scanf("%d%d", &n, &m);
for(i = 0; i < n; i++)
for(j = 0; j < m; j++) {
scanf("%s", s);
if(s[0] == s[1]) {
if(s[0] == ‘1‘) c[2]++;
} else c[1]++;
}
int x = 0, y = 0;
while (c[2] > 0) {
ans[x][y++] = 11;
if(y == m) {
x++;
y = 0;
}
c[2]--;
}
int flag = 1, t = 10;
while (c[1] > 0) {
if(flag) {
ans[x][y++] = t;
if(y == m) {
y = m - 1;
x++;
flag ^= 1;
}
} else {
ans[x][y--] = t;
if(y == -1) {
y = 0;
x++;
flag ^= 1;
}
}
if(t == 10) t = 1;
else if(t == 1) t = 10;
c[1]--;
}
out();
}
D
二分,然后枚举公差,然后O(n)判断
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int a[1003], lim, ans, d, st;
bool ok(int m) {
int i, j;
for(i = 0; i <= lim; i++) {
int l = a[n - 1] - m, r = a[n - 1] + m;
for(j = n - 2; j >= 0; j--) {
l -= i;
r -= i;
l = max(l, a[j] - m);
r = min(r, a[j] + m);
}
if(l <= r) {
st = l;
d = i;
ans = m;
return 1;
}
}
return 0;
}
int main() {
int i;
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a + n);
lim = a[n - 1] - a[0];
int l = 0, r = 30000;
while (l < r) {
int m = (l + r) >> 1;
if(ok(m)) r = m;
else l = m + 1;
}
printf("%d\n%d %d", ans, st, d);
return 0;
}
Codeforces Round #231 (Div. 2)A, B, C, D
原文:http://blog.csdn.net/auto_ac/article/details/19637077