0%

ACM-easy训练

练手速用的,难度在1200~1600之间。

C. Game with Multiset

链接:https://codeforces.com/problemset/problem/1913/C

分数:1300

题意:

给你一个空序列,有以下两种操作:

1、加x , 将 2^x 加入到序列中。

2、给定w ,问是否能从序列中取出若干个元素(不能重复取同一元素)凑出 w

题解:贪心

用cnt数组保存2的i次方位,将v进行拆位,最高位能减就减,依次到低位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int v[35],f[35];

void init() {
f[0] = 1;
for(int i=1;i<=29;i++) f[i] = f[i - 1] * 2;
}
void JiuCherish(){
int n;
std::cin >> n;
while(n--) {
int op;
std::cin >> op;
if(op == 1) {
int x;
std::cin >> x;
v[x]++;
} else {
int x;
std::cin >> x;
for(int i=29;i>=0;i--) {
x -= f[i] * std::min(x / f[i],v[i]);
}
if(x) std::cout << "NO" << endl;
else std::cout << "YES" << endl;
}
}
}

C. Heavy Intervals

链接:https://codeforces.com/problemset/problem/1909/C

分数:1400

题意:

给你一个 l,r,c 数组 ,并重排这三个数组,求重排后权重之和最小可能为多少,权重计算:C_i * (r_i * l_i) 保证每个 i th都满足 r > l。

题解:贪心

用multset维护 l,然后找到小于r[i] 最大的一个,然后通过lower_bound找出大于等于 r[i] 中最小的,用 r[i] - l[i] 的结果丢进 a[i] 里即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
i64 l[MAXN],r[MAXN],c[MAXN];
i64 a[MAXN];
void JiuCherish(){
int n;
std::cin >> n;
std::multiset<int> q;
for(int i=1;i<=n;i++) {
std::cin >> l[i];
q.insert(l[i]);
}
for(int i=1;i<=n;i++) std::cin >> r[i];
for(int i=1;i<=n;i++) std::cin >> c[i];
std::sort(r + 1,r + n + 1);
std::sort(c + 1,c + n + 1);
for(int i=1;i<=n;i++) {
auto x = q.lower_bound(r[i]);
x--;
a[i] = r[i] - (*x);
q.erase(x);
}
std::sort(a + 1,a + 1 + n);
std::sort(c + 1,c + n + 1);
std::reverse(c + 1,c + n + 1);
i64 ans = 0;
for(int i=1;i<=n;i++) ans += a[i] * c[i];
std::cout << ans << endl;
}