[关闭]
@2368860385 2018-07-05T06:12:44.000000Z 字数 1189 阅读 196

965——Codeforces Round #476 (Div. 2) [Thanks, Telegram!]

http://codeforces.com/contest/965/

codeforces

2018.6.12模拟参加(A,B两题)
2018.6.17整理


A:模拟
B:暴力判断(枚举每个点,计算)
C: k 个小朋友围成一圈分 n 个糖 按照 1−k 的顺序轮流给糖。每次给 x 块糖,不足 x 块糖则丢掉结束。规定 x<=M 且 没有小朋友分到的糖的次数比D多(圈数)。求 1号小朋友最多分到多少颗糖。

考试时没做出来。
D很小,如果D已知,可以贪心的求出一号最多拿多少糖。1拿D次,其他的拿D-1次。

Dx+(D-1)(k-1)x <= n (只要小于等于n就行)
x <= n/(Dk-k+1)
ans = D*x
所以x=n/(Dk-k+1)时最优,枚举每个D即可。

D:
有一些青蛙过河。河宽w . 他们每次可以跳 [1,l]区间内任意长度。河上每个位置 i 有 ai个石头,踩一下就会沉下去。最大化青蛙过河的只数。

模拟参加时的思路:
河岸的青蛙必须都要跳出第一步。所以答案最大是到1-L之间的石头的个数。然后在[1~L],[L+1,2L],[2L+1,3L]...这些区间内取最小值。
显然不对。

比如
最大可以跳三个。
1 1 0 0 0 1
那么这组样例是0,而按上面的做法是1。
(考试时想到了这组样例,知道为什么不对,但没有想到改正)

改正:在所有[1,L],[2,L+1],[3,L+2]的区间里取最小值。

模拟参加的思路2
每个青蛙在i可以跳到[i+1,i+L],贪心:越往右越好;写的不怎么对。。。

E:留坑


代码

  1. //A
  2. int main()
  3. int k = read(), n =read(),s = read(),p = read();
  4. int ans,t;
  5. if (n % s == 0) t = (n/s);
  6. else t = (n/s) + 1;
  7. int t2 = t * k;
  8. if (t2 % p == 0) ans = t2 / p;
  9. else ans = t2 / p + 1;
  10. cout << ans;
  11. return 0;
  12. }
  1. //C
  2. int main() {
  3. LL n,m,k,D,ans = 0;
  4. std::cin >> n >> k >> m >> D;
  5. for (int d=1; d<=D; ++d) {
  6. LL x = n/(d*k-k+1);
  7. if (x==0) break;
  8. if (x > m) x = m;
  9. ans = std::max(ans,x*d);
  10. }
  11. std::cout << ans;
  12. return 0;
  13. }
  1. //D
  2. int main() {
  3. int n = read(),L = read();
  4. for (int i=1; i<n; ++i) {
  5. s[i] = s[i-1] + read();
  6. }
  7. int ans = 1e9;
  8. for (int i=L; i<n; ++i) {
  9. ans = min(ans,s[i]-s[i-L]); // r = i,l = i-L+1
  10. }
  11. cout << ans;
  12. return 0;
  13. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注