洛谷1478陶陶摘蘋果升級版
阿新 • • 發佈:2019-01-08
題目描述
又是一年秋季時,陶陶家的蘋果樹結了n個果子。陶陶又跑去摘蘋果,這次她有一個a公分的椅子。當他手夠不著時,他會站到椅子上再試試。
這次與NOIp2005普及組第一題不同的是:陶陶之前搬凳子,力氣只剩下s了。當然,每次摘蘋果時都要用一定的力氣。陶陶想知道在s<0之前最多能摘到多少個蘋果。
現在已知n個蘋果到達地上的高度xi,椅子的高度a,陶陶手伸直的最大長度b,陶陶所剩的力氣s,陶陶摘一個蘋果需要的力氣yi,求陶陶最多能摘到多少個蘋果。
輸入輸出格式
輸入格式:第1行:兩個數 蘋果數n,力氣s。
第2行:兩個數 椅子的高度a,陶陶手伸直的最大長度b。
第3行~第3+n-1行:每行兩個數 蘋果高度xi,摘這個蘋果需要的力氣yi。
只有一個整數,表示陶陶最多能摘到的蘋果數。
輸入輸出樣例
輸入樣例#1:8 15 20 130 120 3 150 2 110 7 180 1 50 8 200 0 140 3 120 2輸出樣例#1:
4
說明
所有資料:n<=5000 a<=50 b<=200 s<=1000
xi<=280 yi<=100
我的程式碼
#include<iostream> using namespace std; int x[5001],y[5001],a,b,n,s,t=0; bool used[5001];//標記該蘋果是否被摘 int main() { cin>>n>>s; cin>>a>>b; a=a+b; for(int i=1;i<=n;i++) { cin>>x[i]; cin>>y[i]; used[i]=0; } for(int i=1;i<=n;i++) if(x[i]>a) used[i]=1;//若摘不到,視為已摘 int i=0; while(s>=0) { int j=10000,k=1; i=1; while(used[i]&&i<=n) i++; //若蘋果被摘,下一個 while(i<=n) { if(j>y[i]&&!used[i]) { j=y[i];//j標記所用最小的力氣 k=i;//k標記要摘的蘋果 } i++; } used[k]=1;//蘋果已摘 s-=j;//力氣減少 t++;//個數加一 } cout<<t-1;//s小於零個數才加一,減去最後一個實際摘不到的 return 0; }