CodePlus 2017 11 月赛 Div. 2

T1 晨跑 jogging

超级大水题,直接用 gcd a ,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 <script type="math/tex" id="MathJax-Element-13">2</script> 表示小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,捞了件外套。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值