1. 程式人生 > >(福建工程大ACM程式設計)E題分配物資(模擬題)

(福建工程大ACM程式設計)E題分配物資(模擬題)

連結: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; }