Codeforces Round #523 (Div. 2) Solution

A. Coins

Water.

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n, s;
 4
 5 int main()
 6 {
 7     while (scanf("%d%d", &n, &s) != EOF)
 8     {
 9         int res = 0;
10         for (int i = n; i >= 1; --i) while (s >= i)
11         {
12             ++res;
13             s -= i;
14         }
15         printf("%d\n", res);
16     }
17     return 0;
18 }

B. Views Matter

Solved.

题意:

有n个栈,不受重力影响,在保持俯视图以及侧视图不变的情况下,最多可以移掉多少个方块

思路:

考虑原来那一列有的话那么这一列至少有一个,然后贪心往高了放

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 #define ll long long
 5 #define N 100010
 6 int n, m;
 7 ll a[N], sum;
 8
 9 int main()
10 {
11     while (scanf("%d%d", &n, &m) != EOF)
12     {
13         sum = 0;
14         for (int i = 1; i <= n; ++i) scanf("%lld", a + i), sum += a[i];
15         sort(a + 1, a + 1 + n);
16         ll res = 0, high = 0;
17         for (int i = 1; i <= n; ++i) if (a[i] > high)
18             ++high;
19         printf("%lld\n", sum - n - a[n] + high);
20     }
21     return 0;
22 }

C. Multiplicity

Upsolved.

题意:

定义一个序列为好的序列即$b_1, b_2, ...., b_k 中i \in [1, k] 使得 b_i % i == 0$

求有多少个好的子序列

思路:

考虑$Dp$

$令dp[i][j] 表示第i个数,长度为j的序列有多少种方式$

$dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]   (arr[j] % j == 0)$

否则 $dp[i][j] = dp[i - 1][j]$

然后不能暴力递推,只需要更新$arr[j] % j == 0 的j即可$

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 #define ll long long
 5 #define N 1000100
 6 const ll MOD = (ll)1e9 + 7;
 7 int n; ll a[N], dp[N];
 8
 9 int main()
10 {
11     while (scanf("%d", &n) != EOF)
12     {
13         for (int i = 1; i <= n; ++i) scanf("%lld", a + i);
14         memset(dp, 0, sizeof dp);
15         dp[0] = 1;
16         for (int i = 1; i <= n; ++i)
17         {
18             vector <int> cur;
19             for (int j = 1; j * j <= a[i]; ++j)
20             {
21                 if (a[i] % j == 0)
22                 {
23                     cur.push_back(j);
24                     if (j != a[i] / j)
25                         cur.push_back(a[i] / j);
26                 }
27             }
28             sort(cur.begin(), cur.end());
29             reverse(cur.begin(), cur.end());
30             for (auto it : cur)
31                 dp[it] = (dp[it] + dp[it - 1]) % MOD;
32         }
33         ll res = 0;
34         for (int i = 1; i <= 1000000; ++i) res = (res + dp[i]) % MOD;
35         printf("%lld\n", res);
36     }
37     return 0;
38 }

D. TV Shows

Upsolved.

题意:

有n个电视节目,每个节目播放的时间是$[l, r],租用一台电视机的费用为x + y \cdot time$

一台电视机同时只能看一个电视节目,求看完所有电视节目最少花费

思路:

贪心。

因为租用电视机的初始费用是相同的,那么我们将电视节目将左端点排序后

每次选择已经租用的电视机中上次放映时间离自己最近的,还要比较租用新电视机的费用,

如果是刚开始或者没有一台电视机闲着,则需要租用新的电视机

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 #define ll long long
 5 #define N 100010
 6 struct node
 7 {
 8     ll l, r;
 9     void scan() { scanf("%lld%lld", &l, &r); }
10     bool operator < (const node &r) const
11     {
12         return l < r.l || (l == r.l && this->r < r.r);
13     }
14 }arr[N];
15 int n; ll x, y;
16 const ll MOD = (ll)1e9 + 7;
17 multiset <ll> se;
18
19 int main()
20 {
21     while (scanf("%d%lld%lld", &n, &x, &y) != EOF)
22     {
23         for (int i = 1; i <= n; ++i) arr[i].scan();
24         sort(arr + 1, arr + 1 + n);
25         ll res = 0;
26         for (int i = 1; i <= n; ++i)
27         {
28             if (se.lower_bound(arr[i].l) == se.begin())
29                 res = (res + x + y * (arr[i].r - arr[i].l) % MOD) % MOD;
30             else
31             {
32                 int pos = *(--se.lower_bound(arr[i].l));
33                 if (x < y * (arr[i].l - pos))
34                     res = (res + x + y * (arr[i].r - arr[i].l) % MOD) % MOD;
35                 else
36                 {
37                     se.erase(--se.lower_bound(arr[i].l));
38                     res = (res + y * (arr[i].r - pos) % MOD) % MOD;
39                 }
40             }
41             se.insert(arr[i].r);
42         }
43         printf("%lld\n", res);
44     }
45     return 0;
46 }

E. Politics

Unsolved.

F. Lost Root

Unsolved.

原文地址:https://www.cnblogs.com/Dup4/p/10034173.html

时间: 2024-08-30 17:43:38

Codeforces Round #523 (Div. 2) Solution的相关文章

Codeforces Round #275 (Div.1) Solution

好久没做题了,开场Virtual热热身. A 构造,我的方法是,取1,2,3...,k这几个差值,前k+1个数分别是 1, k+1, 2, k, ...., 之后就k+2, k+3, ..., n B 因为题设是与操作.我们按照每一位来,如果有一个限制某位是1,则将那段区间标志1,没有限制的位全部置零即可,然后检验为0的位是否全是1.标志一段区间可以用标记法,检验可以求和看差值. C 我做完之后看了CF tutorial 跟我的做法不同.我的做法比他给的复杂度低一点,不过题解好帅,而且跑出来速度

Codeforces Round #282 (Div.1) Solution

上午考试,下去去参观教堂,回来睡大觉,搞到现在才有时间做,水平恢复中. A 倒过来扫括号匹配很容易理解 B dp[i]表示最后一个拿到i的数目,sum[i]表示前i项dp和,sum2[i]表示前i项sum和.显然.dp[i]=sum2[o], o是最右边的坐标使得s[o+1,i]能包含t. C Interesting,我建了个树,硬着dp搞得..还没优化就46ms,想来这种题数据也不好构造. D Editorial似乎说离线搞,不过我在线搞出来了.我存了每个节点子树平方和,子树和,整体和,整体平

[比赛] Codeforces Round #538 (Div. 2) solution (贪心,数学其他,二分,线段树)

已经写了100篇题解啦! link solution pdf #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; inline int read(){ int f=1,ans=0;char c; while(c<'0'||c>'9'){if(c=='-')f=-1;c

Codeforces Round #607 (Div. 1) Solution

从这里开始 比赛目录 我又不太会 div 1 A? 我菜爆了... Problem A Cut and Paste 暴力模拟一下. Code #include <bits/stdc++.h> using namespace std; typedef bool boolean; const int N = 1e6 + 5; const int Mod = 1e9 + 7; int T; int x; int len; char s[N]; int paste(int s1, int t1, in

Codeforces Round #268 (Div. 1) solution

A.24 Game 题意:给你1, 2, ..., n-1, n 这个序列,每次你可以取出两个数做+/-/*三种操作之一,然后把结果放回到序列中,询问能否是的这个序列最后只剩下一个24. 解法:首先很明显n < 4的时候是无解的.如果n=4,那么1 * 2 * 3 * 4=24,如果n=5,那么(5 - 1 - 2) * 3 * 4 = 24.若n > 5,那么我可以做n - (n - 1) = 1,相当于变成了n-2时候的情况加一个1,那么显然最后让答案乘上这个1即可. 代码: includ

Codeforces Round #276 (Div.1) Solution

水平越来越菜了 A  水题,注意后面全是1的情况 B  调和级数呀.把倍数全部扫一遍.一个数是多个数的倍数的话肯定是大的比较优.然后可以用two pointer扫一下. C  就是一个置换群,把轮换找出来就好了.傻逼的写了好久. D  有意思的傻逼DP,容易得到dp[i] = max{dp[j] + max{abs(a[k]-a[h])}} .只要更新一个U = max{a[i] + max_{0~(i-1)}{dp[i]}}和D = max{-a[i] + max_{0~(i-1)}{dp[i

Codeforces Round #283 (Div.1) Solution

A 贪心,从第一列开始一旦有不符合就把这列去掉.因为如果符合只可能使后面优势更大. B 枚举t就能找到局面了.因为调和级数的和是logn所以复杂度符合要求. C 将actor和part一起排好序,L小先,R大先,actor先.容易发现排在某个part后面的actor是不可能包含它的.它之后的part对于前面出现actor的L没有要求,于是每个part要尽量节约的使用R,于是找比自己R大最小的.set维护即可. D 题意是两个多边形围绕自己中心同样的角速度顺时针转,问有没有可能撞到.一眼就想到可以

Codeforces Round #269 (Div. 2) Solution

又趁夜撸了一发DIV2,然后由于困完挂了. 现在最终测试的结果还没有出来,估计写完就出来了. 通过了前四道题的Pretest. update:这一次rank220,坑了! A:给你六个长度(分别是四肢,头,躯干),让你判断这是什么物种.判断规则十分清楚了,然而我自己没注意看...导致被hack,并wa了数次. 思路:排序后直接找出四个相同的长度,若不存在为alien,否则剩下的两个相等elephant,再否则bear. Code: #include <cstdio> #include <

Codeforces Round #267 (Div. 2) solution

A.George and Accommodation 题目大意:给你n个宿舍的可以容纳的人数和现在已住的人数,问有几个宿舍可以安排两个人进去住. 解法:模拟,无trick. 代码: 1 #include <cstdio> 2 3 int main() { 4 int n; 5 while(scanf("%d", &n) != EOF){ 6 int a, b, ans = 0; 7 for(int i = 0; i < n; i++) { 8 scanf(&q