生活随笔
收集整理的這篇文章主要介紹了
[UVALive 3971] Assemble
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖片加載可能有點慢,請跳過題面先看題解,謝謝
又是道一眼題。。。
這道題最惡心的地方不是輸入么。。。
直接二分一個 \(quality\) ,在每種配件里去找品質大于等于 \(quality\) 的價格最小的配件,將價格加起來,如果大于 \(b\),則不合法
真是愉快的一天。。。
切了一天的水題。。。
$
$
//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#define inf (1<<30)
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int T,n,b,cnt,Max;
map<string,int>ma;
il int idx(string s){if(!ma.count(s)) ma[s]=++cnt;return ma[s];
}
struct com{int c,q;};
vector<com>vec[1010];il void init(){n=gi(),b=gi(),cnt=0,Max=0;for(RG int i=1;i<=n;i++) vec[i].clear();for(RG int i=1;i<=n;i++){RG char a[25],b[25]; scanf("%s%s",a,b);RG int c=gi(),q=gi(); Max=max(Max,q);vec[idx(a)].push_back((com){c,q});}
}il bool ck(int x){RG int sum=0;for(RG int i=1;i<=cnt;i++){RG int len=vec[i].size(),Min=inf;for(RG int j=0;j<len;j++)if(vec[i][j].q>=x) Min=min(Min,vec[i][j].c);sum+=Min; if(sum>b) return 0;}return 1;
}il void work(){RG int l=0,r=Max,ans=0;while(l<=r){RG int mid=(l+r)>>1;if(ck(mid)) ans=mid,l=mid+1;else r=mid-1;}printf("%d\n",ans);
}int main(){ T=gi(); while(T--){ init(); work(); } return 0; }
轉載于:https://www.cnblogs.com/Hero-of-someone/p/7653037.html
總結
以上是生活随笔為你收集整理的[UVALive 3971] Assemble的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。