P13422 [COCI 2019/2020 #4] Pod starim krovovima

前言

今天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 个玻璃杯,编号为 111NNN。每个玻璃杯的容量(单位为纳升)已知,杯中当前的液体量也已知。

问题:小 Perica 想知道,通过在玻璃杯之间相互倒液体,最多能让多少个玻璃杯变空。他可以任意多次将任意整数纳升的液体从一个杯子倒到另一个杯子,只要没有液体溢出即可。

你的任务是输出最多能变空的玻璃杯数量,以及一种可能的所有玻璃杯中液体的分布方案。如果有多种分布方案能达到相同数量的空杯,输出任意一种即可。注意,不要求最小化倒液体的次数。

输入格式

第一行包含一个整数 NNN1≤N≤1 0001 \leq N \leq 1\,0001N1000),表示玻璃杯的数量。

接下来的 NNN 行,每行包含两个整数 TiT_iTi0≤Ti≤1090 \leq T_i \leq 10^90Ti109)和 ZiZ_iZi1≤Zi≤1091 \leq Z_i \leq 10^91Zi109),分别表示第 iii 个玻璃杯当前的液体量和容量(单位均为纳升)。保证 Ti≤ZiT_i \leq Z_iTiZi

输出格式

第一行输出最多能变空的玻璃杯数量。

第二行输出 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. 把第 1 个杯子的液体全部倒入第 2 个杯子。
  2. 把第 2 个杯子的液体全部倒入第 4 个杯子。
  3. 把第 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)
兄弟们给个赞呗
先 赞 后 看 养 成 习 惯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zty郑桐羽呀 『ZTY』主团团长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值