前言
今天zty带来的是P13422 [COCI 2019/2020 #4] Pod starim krovovima,大家给个赞呗, zty放暑假了,现在恢复更新了
先 赞 后 看 养 成 习 惯
众所周知,一篇文章需要一个头图(虽然这头图是粉色系,还是好看) 小声嘀咕:宝可梦,仙子伊布好可爱
先 赞 后 看 养 成 习 惯
演示用编译器及其标准
Dev C++ 6.7.5 Red panda C++14
正文
P13422 [COCI 2019/2020 #4] Pod starim krovovima
题目描述
背景:传奇的萨格勒布小酒馆 Kod Žnidaršića。
时间:1936 年。
剧情简介:Franjo 和朋友们正在酒吧里一边喝酒一边讨论阿比西尼亚的时事。他的儿子,小 Perica,坐在酒吧角落的一张小桌子旁。在 Perica 面前,有 NNN 个玻璃杯,编号为 111 到 NNN。每个玻璃杯的容量(单位为纳升)已知,杯中当前的液体量也已知。
问题:小 Perica 想知道,通过在玻璃杯之间相互倒液体,最多能让多少个玻璃杯变空。他可以任意多次将任意整数纳升的液体从一个杯子倒到另一个杯子,只要没有液体溢出即可。
你的任务是输出最多能变空的玻璃杯数量,以及一种可能的所有玻璃杯中液体的分布方案。如果有多种分布方案能达到相同数量的空杯,输出任意一种即可。注意,不要求最小化倒液体的次数。
输入格式
第一行包含一个整数 NNN(1≤N≤1 0001 \leq N \leq 1\,0001≤N≤1000),表示玻璃杯的数量。
接下来的 NNN 行,每行包含两个整数 TiT_iTi(0≤Ti≤1090 \leq T_i \leq 10^90≤Ti≤109)和 ZiZ_iZi(1≤Zi≤1091 \leq Z_i \leq 10^91≤Zi≤109),分别表示第 iii 个玻璃杯当前的液体量和容量(单位均为纳升)。保证 Ti≤ZiT_i \leq Z_iTi≤Zi。
输出格式
第一行输出最多能变空的玻璃杯数量。
第二行输出 NNN 个整数,表示操作后每个玻璃杯中的液体量(顺序与输入一致)。如果有多种方案,输出任意一种即可。
输入输出样例 #1
输入 #1
5
2 6
1 6
0 6
6 6
5 6
输出 #1
2
6 6 2 0 0
输入输出样例 #2
输入 #2
5
4 5
2 7
5 5
0 10
7 9
输出 #2
3
0 0 0 10 8
输入输出样例 #3
输入 #3
8
2 6
3 4
1 1
9 10
0 10
4 5
6 8
3 9
输出 #3
5
0 0 0 9 10 0 0 9
说明/提示
对第二个样例的说明:一种可能的倒液体方案如下:
- 把第 1 个杯子的液体全部倒入第 2 个杯子。
- 把第 2 个杯子的液体全部倒入第 4 个杯子。
- 把第 3 个杯子的 4 纳升液体倒入第 4 个杯子,把第 3 个杯子的 1 纳升倒入第 5 个杯子。
此时,第 1、2、3 号杯子都为空。
翻译由 ChatGPT-4.1 完成。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct Cup {
int index;
ll T, Z;
};
bool cmp(const Cup &a, const Cup &b) {
return a.Z > b.Z;
}
int main() {
int N;
cin >> N;
vector<Cup> cups(N);
ll total_water = 0;
for (int i = 0; i < N; ++i) {
cin >> cups[i].T >> cups[i].Z;
cups[i].index = i;
total_water += cups[i].T;
}
sort(cups.begin(), cups.end(), cmp);
vector<ll> result(N, 0);
int empty_count = 0;
for (int i = 0; i < N; ++i) {
if (total_water > 0) {
ll fill = min(total_water, cups[i].Z);
result[cups[i].index] = fill;
total_water -= fill;
} else {
empty_count++;
}
}
cout << empty_count << endl;
for (int i = 0; i < N; ++i) {
cout << result[i] << " ";
}
return 0;
}
后记
作者:zty郑桐羽呀
联系方式:(企鹅 3782663736)
兄弟们给个赞呗
先 赞 后 看 养 成 习 惯