ABC220G-The Baggage

题目描述

有重量为1-5的一些物品
和一些能力值为1-5的人,一个人最多拿和他能力值相同的物品
问能不能把物品全拿完。

题解

是贪心,但是细节。
一步步分析。
一个结论是,一个人能力值为a,拿了一个质量为m的物品,他就等价于一个能力值为a-m的人。
首先对于重量为5的 肯定只有能力为5的人能拿
接着重量为4 先用4拿 剩下的用5拿
对于3,先用3,再用4,最后用5,很容易想到这样的的贪心。
对于以上三种情况,因为一个人最多拿一个,我们希望尽量使用小的人,把能力值大的留给后面
但是下面小于等于2的情况,假如剩下一些质量为2的物品,我们先用2去拿,设剩下的2个物品,只有一个能力为5的人。
按照上次的处理方法,我们扫描到5的时候,发现能放,这样我们剩下一个质量为2的物品和一个能力为3的人,这时就会判断为无解。
所以到后面1和2的时候我们把枚举顺序换过来,从大到小使用剩下的人,就能解决问题。
code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<bitset>
#include<set>
#define ll long long
#define int ll
using namespace std;
const int inf = 0x7fffffff;
int T;
int a[12],b[12];
void Sol(int x,int y)
{
	int mx=min(a[x],b[y]);
	a[x]-=mx;
	b[y]-=mx;
	b[y-x]+=mx;
}
signed main()
{
	scanf("%lld",&T);
	while(T--)
	{
		for(int i=1;i<=5;i++)scanf("%lld",&a[i]);
		for(int i=1;i<=5;i++)scanf("%lld",&b[i]);
		Sol(5,5);
		Sol(4,4);Sol(4,5);
		Sol(3,3);Sol(3,5);Sol(3,4);
		Sol(2,5);Sol(2,4);Sol(2,3);Sol(2,2);//剩下5去打2 可能一次打两个 要先打 
		Sol(1,5);Sol(1,4);Sol(1,3);Sol(1,2);Sol(1,1);
		bool ok=1;
		for(int i=1;i<=5;i++)if(a[i]>0)ok=0;
		if(ok)printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}
posted @ 2021-11-08 20:10  lzylzy/kk  阅读(68)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end