二分答案求调
查看原帖
二分答案求调
270854
二叉苹果树楼主2022/10/12 16:42

思路:对于每个种类,买符合条件的每种取最小值,二分答案

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000
int A,B,kind;
map<string,bool>f;
int p[MAXN],q[MAXN];
string v[MAXN],b; 
bool check(int x)
{
	int K=0;
	long long sum=0;
	map<string,int>Price=map<string,int>();
	map<string,bool>F=map<string,bool>();
	for(int i=1;i<=A;i++)
	    Price[v[i]]=0x3f3f3f3f;
	for(int i=1;i<=A;i++)
		if(q[i]>=x)
	        Price[v[i]]=min(Price[v[i]],p[i]);
	for(int i=1;i<=A;i++)
	    if(!F[v[i]])
	    {
	    	F[v[i]]=1;
	    	sum+=Price[v[i]];
	        K++;
		}
    if(sum>B||K<kind)
        return 0;
    return 1;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		cin>>A>>B;
		for(int i=1;i<=A;i++)
		{
			cin>>v[i]>>b;
			if(!f[v[i]])
			    kind++;
			f[v[i]]=1;
			cin>>p[i]>>q[i];
		}
		long long l=0,r=1000000000000,ans;
		while(l<=r)
		{
			long long mid=l+r>>1;
			if(check(mid))
			    l=mid+1,ans=mid;
			else
			    r=mid-1;
		}
		cout<<ans<<endl;
	}
	return 0;
} 
2022/10/12 16:42
加载中...