(福建工程大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;
}


猜你喜欢

转载自www.cnblogs.com/mlcn-2000/p/10102696.html