cf105 div2 解题报告
比赛时暴露出现好多问题,赛后要好好总结:
暴力:
k = [input() for i in xrange(4)] d = input() print len(set([j for i in k for j in range(1,d+1) if j%i==0]))
简单计算题,比赛时没考虑龙的初始速度要比公主快,赛后挂了
double eps = 0.00000001;
int main() {
int vp, vd, t, f, c, n = 0;
scanf("%d%d%d%d%d", &vp, &vd, &t, &f, &c);
if (vp >= vd) {//龙的初始速度没公主快的话必然追不上,赛后挂在这里了
puts("0");
return 0;
}
//公主的初始距离
double dis = t*vp;
while (1) {
//龙追到公主时的距离
dis += dis / (vd - vp) * vp;
if ((c - dis) <=0)
break;
n++;
//龙返回原点并处理f事情后 公主的距离
dis += (dis / vd + f) * vp;
}
printf("%d\n", n);
return 0;
}
C 题目不难,需要仔细考虑,我的代码比较乱,就不拿出来了
D dp...研究中
E 分组背包,先预处理每一组里不同个数的最大值,然后上分组背包模版
const int MAXN = 128; const int MAXM = 10086;
int dp[MAXM], a[MAXN], Max[MAXN], Left[MAXN], Right[MAXN];
int main() {
int n, m, num, sum;
scanf("%d%d", &n, &m);
fill(dp, dp + m + 1, 0);
sum = 0;
for (int i = 0; i < n; ++i) {
scanf("%d", &num);
sum+=num;
for (int i = 1; i <= num; ++i) {
scanf("%d", a + i);
}
fill(Left, Left + num + 1, 0);
fill(Right, Right + num + 1, 0);
fill(Max, Max + num + 1, 0);
for (int i = 1; i <= num; ++i) {//左边和右边i个数的总和
Left[i] = Left[i - 1] + a[i];
Right[i] = Right[i - 1] + a[num - i + 1];
}
for (int i = 1; i <= num; ++i) {
for (int j = 0; j <= i; ++j) {
Max[i] = max(Max[i], Left[j] + Right[i - j]);
}
}
//此时Max[i]为预处理后i个数和的最大值
for (int V = m; V >=0; --V) {//这里v的初始值可以优化为min(m, sum),sum是目前出现数字的个数
for (int i = min(num,V); i >0 ; --i) {//保证i<=V,为了下面不会数组越界,保证i<=num,是题意
dp[V] = max(dp[V], dp[V - i] + Max[i]);//i同时也是背包里面消耗的费用
}
}
}
printf("%d\n", dp[m]);
return 0;
}