Codeforces Round #127 (Div. 1)

来源:互联网 发布:linux 查找匹配字符串 编辑:程序博客网 时间:2024/06/05 12:53

A. Clear Symmetry:

水题坑了一下,3的时候要特判


#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int main() {    int x;    scanf("%d", &x);    if(x == 3)  return puts("5"), 0;    for(int i = 1;i <= 100; i+= 2) {        int tot = (i*i+1)/2;        if(tot >= x)    return printf("%d\n", i), 0;    }    return 0;}


B. Guess That Car!

其实最后发现x,y上的距离可以分开算的。


#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;typedef __int64 ll;const int maxn = 1000 + 5;int a[maxn][maxn];ll x[maxn], y[maxn];int get(int i, int j) {    if(i < j)   return (j-i)*4-2;    return (i-j)*4+2;}int main() {    int n, m;    scanf("%d%d", &n, &m);    for(int i = 1;i <= n; i++)        for(int j = 1;j <= m; j++)            scanf("%d", &a[i][j]);    for(int i = 1;i <= n; i++) {        for(int j = 1;j <= m; j++) {            x[i] += a[i][j];            y[j] += a[i][j];        }    }    ll ansx, ansy;    int xx = -1, yy = -1;    for(int i = 0;i <= n; i++) {        ll cur = 0;        for(int j = 1;j <= n; j++)            cur += x[j]* get(i, j)*get(i, j);        if(xx == -1 || ansx > cur) {            xx = i; ansx = cur;        }    }    for(int i = 0;i <= m; i++) {        ll cur = 0;        for(int j = 1;j <= m; j++) {            cur += y[j]*get(i, j)*get(i, j);        }        if(yy == -1 || ansy > cur) {            yy = i; ansy = cur;        }    }    printf("%I64d\n", ansx + ansy);    printf("%d %d\n", xx, yy);    return 0;}

C. Fragile Bridges


有n个城市,可以发现,从第i个城市开始,到第j个城市结束,那么第i个城市左边每条路都是走偶数次的,i,j城市中间每条路都是走奇数次的,j城市右边都是走偶数次的,需要注意的是如果i左边的某条路个数为1则不能过去了,j右边的也一样。


#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;typedef __int64 ll;const int maxn = 100000 + 5;ll a[maxn], c[maxn], d[maxn];int next[maxn];int main() {    int n;    scanf("%d", &n);    for(int i = 1;i < n; i++)        scanf("%I64d", &a[i]);    for(int i = 1;i < n; i++) {        if(a[i]&1) {            d[i] = d[i-1] + a[i]-1;            c[i] = c[i-1] + a[i];        }        else {            d[i] = d[i-1] + a[i];            c[i] = c[i-1] + a[i]-1;        }    }    int cur = n-1;    for(int i = n-1;i >= 0; i--) {        if(a[i+1] == 1) {            cur = i;        }        next[i] = cur;    }    ll ans = d[n-1], mx = 0;    int pre = 0;    for(int i = 1;i < n; i++) {        if(a[i] == 1)            pre = i;        mx = max(mx, d[i] - c[i] - d[pre]);        ans = max(ans, mx + d[next[i]] - d[i] + c[i]);    }    printf("%I64d\n", ans);    return 0;}


原创粉丝点击