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();
}

1167

被折叠的 条评论
为什么被折叠?



