CodePlus 2017 11 月賽 Div. 2

T1 晨跑 jogging

超級大水題,直接用 gcda ,b ,c 的最小公倍數即可。
然而在賽場上,評測機卡了, 我第一題一直沒交上去。

#include <cstdio>
#define R register
long long gcd(R long long A, R long long B){ return B == 0 ? A : gcd(B, A % B); }
int main()
{
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    R long long d = gcd(a, b);
    d = 1ll * a * b / d;
    R long long q = gcd(d, c);
    q = 1ll * d / q * c;
    printf("%lld", q);
    return 0;
}

T2 汀博爾 timber

也挺簡單的。看一眼發現滿足單調性,第 x 月能滿足訂單,第 x+1 月也一定滿足,於是二分一下答案,AC。

#include <cstdio>
#define R register
#define Max(_A, _B) (_A > _B ? _A : _B)
int n, t;
long long r, S, L, l = -1, tmp;
int a[200010], H[200010];
int main()
{
    scanf("%d %lld %lld", &n, &S, &L);
    r = Max(S, L);
    for(R int i = 1; i <= n; i++) scanf("%d", &H[i]);
    for(R int i = 1; i <= n; i++) scanf("%d", &a[i]), t = Max(a[i], t);
    r = r / t + 10;
    while(r - l > 1)
    {
        R long long mid = r + l >> 1;
        tmp = 0;
        for(R int i = 1; i <= n; i++) 
        {
            R long long u = 1ll * a[i] * mid + H[i];
            if(u >= L) tmp += u;
            if(tmp >= S) break;
        }
        if(tmp >= S) r = mid;
        else l = mid;
    }
    printf("%lld", r);
    return 0;
}

T3 找爸爸 dnaseq

這也是Div. 1的第一題,看上去和最長公共子序列很像,數據範圍 n+m3000 ,於是可以有這樣的一個動態規劃方程,記 f[i][j][02] 表示小A的序列做到第 i 個,小B的序列做到第 j 個,0 表示均非空格,1 表示小A爲空格,2 表示小B爲空格,然後就非常簡單了,詳情看代碼。
然而在賽場上由於前兩題都交不上去,就沒去寫代碼了,比賽結束後發現居然又延長半小時了,還換提交方式了,趕快碼了一發,結果細節掛了,掛到20了。

#include <cstdio>
#include <cstring>
#define R register
#define Max(_A, _B) (_A > _B ? _A : _B)
int f[3010][3010][3], A, B;
char s1[3010], s2[3010];
int S1[3010], S2[3010], n, m, k[5][5];
int judge(char ch)
{
    if(ch == 'A') return 0;
    if(ch == 'T') return 1;
    if(ch == 'G') return 2;
    return 3;
}
int main()
{
    memset(f, -63, sizeof(f));
    scanf("%s %s", s1 + 1, s2 + 1);
    n = strlen(s1 + 1), m = strlen(s2 + 1);
    for(R int i = 1; i <= n; i++) S1[i] = judge(s1[i]);
    for(R int i = 1; i <= m; i++) S2[i] = judge(s2[i]);
    for(R int i = 0; i <= 3; i++)
        for(R int j = 0; j <= 3; j++)
            scanf("%d", &k[i][j]);
    scanf("%d %d", &A, &B);
    f[0][0][0] = 0;
    f[0][1][1] = f[1][0][2] = -A;
    for(R int i = 1; i <= n; i++)
    {
        for(R int j = 1; j <= m; j++)
        { 
            f[i][j][0] = Max(f[i - 1][j - 1][0], f[i][j][0]);
            f[i][j][0] = Max(f[i - 1][j - 1][1], f[i][j][0]);
            f[i][j][0] = Max(f[i - 1][j - 1][2], f[i][j][0]);
            f[i][j][0] += k[S1[i]][S2[j]];
            f[i][j][1] = Max(f[i][j - 1][0] - A, f[i][j][1]);
            f[i][j][1] = Max(f[i][j - 1][1] - B, f[i][j][1]);
            f[i][j][1] = Max(f[i][j - 1][2] - A, f[i][j][1]);
            f[i][j][2] = Max(f[i - 1][j][0] - A, f[i][j][2]);
            f[i][j][2] = Max(f[i - 1][j][1] - A, f[i][j][2]);
            f[i][j][2] = Max(f[i - 1][j][2] - B, f[i][j][2]);
        }
    }
    R int q = Max(f[n][m][0], Max(f[n][m][1], f[n][m][2]));
    printf("%d", q);
    return 0;
}

T4就沒去看了,直接棄療,居然還能進前50,撈了件外套。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章