(福建工程大ACM程式設計)E題分配物資(模擬題)
阿新 • • 發佈:2018-12-11
連結:https://ac.nowcoder.com/acm/contest/289/E
題目描述
要將n種物資分配到m個村莊中.村莊按照1,2,3...m編號.
已知第i種物資有Ai個.
第i個村莊只需某一種物資Bi個.
物資按照村莊編號升序發放.
問第i個村莊能否得到所需物資,
如果不能得到所需物資,那麼差幾個物資.
輸入描述:
多組資料,直到EOF. 輸入資料中每組資料以空行隔開
第一行輸入n, m, q. n表示物資種類數, m表示村莊個數. q表示詢問個數
接下來輸入n行,每行輸入一個整數Ai, 表示第i種物資的個數.
再接下來m行,每行輸入兩個整數 a Bi, 表示第i個村莊需要a物資 Bi個.
最後q行,每行只有一個數i, 詢問第i個村莊是否得到所需物資.
1<=n<=103, 1<=m<=106, 1<=q<=106
0<=Ai<=106, 0<=Bi<=106
輸出描述:
每個詢問輸出一行.
如果可以得到所需物資則輸出 Yes, 否則輸出該村莊差多少個物資.
思路:這是道簡單模擬題,直接用結構儲存村莊的資訊再模擬分配物資的過程即可,但是我自己寫的時候因為熟練度不夠花了十多分鐘去調整細節,思路很快就出來了。還是要多多練習熟練度。
程式碼如下
#include <iostream> #define maxn 100001 using namespace std; int good[1001]; struct need{ int number; int Rneed; int flag=0; }; int main() { int n,m,q; while(cin>>n>>m>>q) { need ans[maxn]; for(int i=0;i<n;i++) cin>>good[i];for(int i=0;i<m;i++) cin>>ans[i].number>>ans[i].Rneed; for(int i=0;i<m;i++) { if(ans[i].Rneed>good[ans[i].number-1]) { ans[i].Rneed-=good[ans[i].number-1]; good[ans[i].number-1]=0; } else { good[ans[i].number-1]-=ans[i].Rneed; ans[i].flag=1; } } while(q--) { int i; cin>>i; if(ans[i-1].flag) cout<<"Yes"<<endl; else{ cout<<ans[i-1].Rneed<<endl; } } } return 0; }