T1 晨跑 jogging
超级大水题,直接用
gcd
求
a
,
然而在赛场上,评测机卡了, 我第一题一直没交上去。
#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
也挺简单的。看一眼发现满足单调性,第
#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+m≤3000
,于是可以有这样的一个动态规划方程,记
f[i][j][0∼2]
表示小A的序列做到第
i
个,小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,捞了件外套。