0%

2023牛客寒假算法训练营5

A.小沙の好客

题意:

有一家超市,超市里面有 n 件商品,X现在有 Q 个问题,X 让你帮忙挑选最多 k 个价值不大于 x 的商品,问每次最大价值是多少?

数据范围:

ai表示商品的价格

$$1\leq n \leq 10^5,1\leq Q \leq 10^5$$

$$1\leq a_i \leq 10^9$$

$$1 \leq k \leq n,1 \leq x \leq10^9$$

题解:二分,前缀和

对商品价值排序之后,通过前缀和进行计算,最后通过二分,找到 x 所在a的位置。

代码

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
void JiuCherish(){
int n,q;
std::cin >> n >> q;
for(int i=1;i<=n;i++) std::cin >> a[i];
std::sort(a + 1,a + 1 + n);
for(int i=1;i<=n;i++) pre[i] = pre[i - 1] + a[i];
while(q --) {
int x,k;
std::cin >> x >> k;
int l = 0,r = n;
int mid = 0;
while(l < r) {
mid = l + r + 1 >> 1;
if(a[mid] <= k) {
l = mid;
} else {
r = mid - 1;
}
}
if(l <= x) {
std::cout << pre[l] << endl;
} else {
std::cout << pre[l] - pre[l - x] << endl;
}
}
}

B.小沙の博弈

题意:

在两人A与B都十分聪明的情况,他们会选择最优的胜利方式,桌上有 n 个石子,他们两个人面前均有排成一行的若干个格子,每个格子都可以置放无限多个石子。

A先走,每次拿任意正整数个石子,放在第一个没有石子的格子里。

当桌上石子数为 0 的时候游戏结束,按照两人各自中石子数目组成序列的字典序判断胜负,字典序小的人获胜。

数据范围:

$$1 \leq n \leq 10^5$$

输出一个字符串。

当A获胜时输出:”Sajin-win!”(不含引号)。

当B获胜时输出:”Yaya-win!”(不含引号)。

如果都没获胜,输出”win-win!”(不含引号)。

题解:博弈

当石子数目为偶数的时候,双方的字典序必然是相同的,当石子数为奇数的时候,先手必输即字典序大。

代码:

1
2
3
4
5
6
7
8
9
void JiuCherish(){
int n;
std::cin >> n;
if(n & 1) {
std::cout << "Yaya-win!" << endl;
} else {
std::cout << "win-win!" << endl;
}
}

C. 小沙の不懂

D.小沙の赌气

E.小沙の印章

F.小沙の串串

G.小沙の编码

H.小沙の店铺

I. 小沙の金银阁

J.小沙の最短路

K.小沙の抱团 easy

L.小沙の抱团 hard