【NOI】2407:書架/ 4.6演算法之貪心
阿新 • • 發佈:2019-01-06
先獻上傳送門:檢視
2407:書架
總時間限制:
20000ms
單個測試點時間限制:
1000ms
記憶體限制:
65536kB
描述
John最近買了一個書架用來存放奶牛養殖書籍,但書架很快被存滿了,只剩最頂層有空餘。
John共有N頭奶牛(1 ≤ N ≤ 20,000),每頭奶牛有自己的高度Hi(1 ≤ Hi ≤ 10,000),N頭奶牛的總高度為S。書架高度為B(1 ≤ B ≤ S < 2,000,000,007).
為了到達書架頂層,奶牛可以踩著其他奶牛的背,像疊羅漢一樣,直到他們的總高度不低於書架高度。當然若奶牛越多則危險性越大。為了幫助John到達書架頂層,找出使用奶牛數目最少的解決方案吧。
輸入
第1行:空格隔開的整數N和B
第2~N+1行:第i+1行為整數Hi
輸出
能達到書架高度所使用奶牛的最少數目
樣例輸入
6 40 6 18 11 13 19 11
樣例輸出
3
------------------------------------華麗的答案分割線------------------------------------
這是一道簡單的貪心題,可我還是個萌新,也被忽悠了幾回:
#include<bits/stdc++.h> using namespace std; int main() { int n,b,high[20001],max=0,sum=0,i; cin>>n>>b; for(i=1;i<=n;i++) cin>>high[i]; aa: for(i=1;i<=n;i++) { if(high[i]>max) { max=high[i]; high[i]=0; } } b-=max; max=0; sum++; if(b<=0) cout<<sum; else goto aa; return 0; }
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,b,high[20001],max=0,sum=0,i;
cin>>n>>b;
for(i=1;i<=n;i++)
cin>>high[i];
for(i=1;i<=n;i++)
{
if(high[i]>max)
{
max=high[i];
high[i]=0;
}
if(i==n)
{
b-=max;
max=0;
sum++;
if(b<=0)
cout<<sum;
else
i=1;
}
}
return 0;
}
這兩回Time Limit Exceeded了,我也是逗了,於是我把思考的地點由腳指頭變為腦子,終於對了:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,b,high[20001],sum=0,i;
cin>>n>>b;
for(i=0;i<n;i++)
cin>>high[i];
sort(high,high+n);
for(i=n-1;i>=0;i--)
{
sum++;
b-=high[i];
if(b<=0)
{
cout<<sum;
break;
}
}
return 0;
}