poj 3497 or hdu 2333

来源:互联网 发布:日本和服的来源知乎 编辑:程序博客网 时间:2024/05/17 23:34
//方法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;}


 

原创粉丝点击