Codeforces 978(Div 2)A-B(c,d后面补)

A题:

题意:有n个家庭和k排座位的大巴车,每个家庭有ai个人,每排最多能坐两个人,要是同一个家庭的人坐在一起,那么他们会觉得幸福,同时,要是一个人单独坐一排,那么他也会觉得幸福.求幸福的人的最大数.

题解:我们可以先让家庭人数大于等于2人的先坐,看他们能占用几排,他们都是幸福的,记录下剩余的排数,然后就是那些不可能和家庭人一起坐的人了,用总人数减去已经坐下的幸福的人就是剩余人数,此时要是剩余排数大于剩余人数,那么他们将都会是幸福的,否则的话,就使剩余人数-2,排数-1,直到剩余人数和排数相等就是最优解.

AC代码

​
#include <bits/stdc++.h>
using namespace std;
void solve()
{
    int n, k;
    cin >> n >> k;
    vector<int> a(n);
    int sum = 0;
    for (int i = 0; i < n; ++i)
    {
        cin >> a[i];
        sum += a[i];//统计总人数
    }
    int ans = 0;
    int cnt = 0;//cnt是已经坐满人的排数
    for (int i = 0; i < n; ++i)
    {
        ans += a[i] / 2 * 2;//此时坐下的人都是幸福的,因为他们是同一个家庭的
        if (a[i] / 2 > 0)
            cnt += a[i] / 2;
    }
    int pai = k - cnt;//剩余排数
    int peo = sum - ans;//剩余人数
    if (pai > peo)
        ans += peo;
    else
    {
        while(pai!=peo)
        {
            pai--;
            peo -= 2;
        }//直到排数和人数相等为止,最后剩下的人都可以自己坐一排,肯定是幸福的
        ans += peo;
    }
    cout << ans << '\n';
}
int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _;
    cin >> _;
    while (_--)
        solve();
}

​

B题

题意:你可以说服顾客最多买k辆不同型号的的车,总共给你n种类型的车,每种类型的车都是ai辆,求最多要多少顾客可以把车卖完

题意:观察样例发现规律,先把汽车总和加起来,然后发现你要是想把车卖完,则最少需要sum/k向上取整个顾客,如果你数量最多的某种车大于你得出来的值,那么就需要你再补上差值,因为每种类型的车顾客最多买一辆,如果小于你得出来的值,就万事大吉.

AC代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long;//记得开ll
void solve()
{
    int n, k;
    cin >> n >> k;
    vector<ll> a(n);
    ll sum = 0;
    ll ans = 0;
    for (int i = 0; i < n; ++i)
    {
        cin >> a[i];
        sum += a[i];//汽车总和
    }
    sort(a.begin(), a.end());
    ans += ((sum + k - 1) / k);//向上取整
    if(a.back()>ans)
        ans = a.back();//如果最后结果小于最大汽车数,那么就更新答案为最大汽车数
    cout << ans << '\n';
}
int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _;
    cin >> _;
    while (_--)
        solve();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值