T1-H 大鱼吃小鱼
生活随笔
收集整理的這篇文章主要介紹了
T1-H 大鱼吃小鱼
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:
給定n條魚,每條魚具有其自身體重,以及被捕食者吃掉后,捕食者會增加的體重。
假如你是一條魚,你可以吃掉任何體重小于等于你的魚類。現在需要吃掉所有n條魚,請問你需要具備的最小體重x是多少。
題目解析:
題目的hint指出二分答案,我們的思路便很明確:
x不會超過最大魚的體重,因為最大的魚直接可以吃掉n條魚,同時,x也不會小于最小魚的體重,如果這樣的話一條魚也吃不掉。這樣,我們得到了x的范圍,在其中進行二分查找即可。
由于魚具有兩種性質,并且需要對體重排序,定義結構如下:
struct fish{int w;int v;bool operator < (const fish &b) const{return w<b.w;} }a[10005];為了判斷體重x能否吃掉所有魚,定義eat函數
int eat(int x) {int i;for(i=1;i<=n;i++) if(a[i].w>x) break;int weight=sum[i-1]+x; for(int j=i;j<=n;j++){if(weight>=a[j].w) weight+=a[j].v;else return 0;}return 1; }其中sum數組預處理了前i條魚提供的增重總和。
完整代碼如下:
#include<stdio.h> #include<climits> #include<iostream> #include<algorithm> using namespace std; struct fish{int w;int v;bool operator < (const fish &b) const{return w<b.w;} }a[10005]; int b[10005]; int sum[10005]; int n; int eat(int x) {int i;for(i=1;i<=n;i++) if(a[i].w>x) break;int weight=sum[i-1]+x; for(int j=i;j<=n;j++){if(weight>=a[j].w) weight+=a[j].v;else return 0;}return 1; } int main() {cin>>n;for(int i=1;i<=n;i++) cin>>a[i].w>>a[i].v;sort(a+1,a+1+n);sum[1]=a[1].v;for(int i=2;i<=n;i++) sum[i]=sum[i-1]+a[i].v;int l=a[1].w,r=a[n].w;int mid;// printf("7");while(l<r){mid=(l+r)/2;if(eat(mid)) r=mid;else l=mid+1; }cout<<mid;}總結
以上是生活随笔為你收集整理的T1-H 大鱼吃小鱼的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ACRCOCAD盘凸轮DMIS程序
- 下一篇: NokiaE6 java_JAVA性能比