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