poj 3497 or hdu 2333

//方法1:
#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
struct compute
{
	int zl,jg,pz;
}d[1005];
int init[1005],n,w,Count;
map<string,int> ma;
int cmp(compute a,compute b)
{
	return a.pz<b.pz;
}
int weight(int middle)
{
	int i,j,s;
	memset(init,-1,sizeof(init));
	for(i=middle;i<n;i++)
	{
		if(init[d[i].zl]==-1) init[d[i].zl]=d[i].jg;
		else if(init[d[i].zl]>d[i].jg) init[d[i].zl]=d[i].jg;
	}
	for(s=i=0;i<Count;i++)
	if(init[i]==-1) return 0;
	else s+=init[i];
	if(s>w) return 0;
	else return 1;	
}
int binary()
{
	int left=0,right=n-1,middle;
	while(left<right)
	{
		middle=(left+right+1)/2;//此处要加1啊,不然遇到8,9就成死循环,超时就在这!!! 
		if(weight(middle))  left=middle;
		else right=middle-1;
	}
	return d[left].pz;
}
int main(int argc, char *argv[])
{
	int t,i,j;
	string s; char a[25];
	cin>>t;
	while(t--)
	{   Count=0;
		scanf("%d%d",&n,&w);
		for(i=0;i<n;i++)
		{	scanf("%s",a);
			s=a;
			scanf("%s%d%d",a,&d[i].jg,&d[i].pz);
			if(ma.find(s)==ma.end()) ma[s]=Count++;
			d[i].zl=ma[s];
		}
		ma.clear();
		sort(d,d+n,cmp);
		printf("%d\n",binary());	
	} 
	return 0;
}


 方法2:

#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
struct compute
{
	int jg,pz;
};
vector<compute> d[1005];
int n,w,Count;
map<string,int> ma;
int weight(int middle)
{
	int i,j,s,k,minjg,kk;
	for(k=s=i=0;i<Count;i++)
	{   minjg=1000000005;
		for(kk=j=0;j<d[i].size();j++)
			if(d[i][j].pz>=middle)
			{
				if(minjg>d[i][j].jg) minjg=d[i][j].jg;
				kk=1;
			}
		if(kk){s+=minjg;k++;}
		if(s>w) return 0;
	}
	return k==Count&&s<=w;
}
int binary(int left,int right)
{
	int middle;
	while(left<right)
	{   
		middle=(left+right+1)/2;
		if(weight(middle))  left=middle;
		else right=middle-1;
	}
	return left;
}
int main()
{
	int t,i,j,minpz,maxpz;
	compute tt;
	string s; char a[25];
	scanf("%d",&t);
	while(t--)
	{   Count=0; minpz=1000000005; maxpz=1000000005;
		scanf("%d%d",&n,&w);
		for(i=0;i<n;i++)
		{	scanf("%s",a);
			s=a;
			scanf("%s%d%d",a,&tt.jg,&tt.pz);
			if(tt.pz<minpz)minpz=tt.pz;
			if(tt.pz>maxpz)maxpz=tt.pz;
			if(!ma.count(s)) ma[s]=Count++;
			d[ma[s]].push_back(tt);
		}
		printf("%d\n",binary(minpz,maxpz));
		ma.clear();
		for(i=0;i<Count;i++)
			d[i].clear();	
	} 
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值