NC21698. 分配物资
描述
要将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, 否则输出该村庄差多少个物资.
示例1
输入:
3 3 3 5 15 8 1 6 2 3 3 16 1 2 3 3 5 6 5 8 15 2 7 2 10 1 5 3 100 3 123 1 2 3 4 5 1
输出:
1 Yes 8 Yes 9 Yes 85 123 Yes
C(clang 3.9) 解法, 执行用时: 160ms, 内存消耗: 9336K, 提交时间: 2020-05-01 16:51:57
#include<stdio.h> #include<string.h> const int inf=0x3f3f3f3f; typedef long long ll; #define maxn 1000005 int main() { int n,m,q,i,x,y; while(~scanf("%d %d %d",&n,&m,&q)){ int a[maxn]={0},b[maxn]={0}; for(i=1;i<=n;i++){ scanf("%d",&a[i]); } for(i=1;i<=m;i++){ scanf("%d %d",&x,&y); if(y<=a[x]){ a[x]-=y; } else { b[i]=y-a[x]; a[x]=0; } } while(q--){ scanf("%d",&x); if(b[x]) printf("%d\n",b[x]); else puts("Yes"); } } return 0; }
C++14(g++5.4) 解法, 执行用时: 128ms, 内存消耗: 1632K, 提交时间: 2018-12-09 16:14:38
#include<stdio.h> int a[1000002],b[1000002],c[1000002]; int main(){ int n,m,p,k,t; while(~scanf("%d%d%d",&n,&m,&p)){ for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=m;i++){ scanf("%d%d",&k,&t); if(a[k]<t){ b[i]=t-a[k]; a[k]=0; } else{ b[i]=0; a[k]-=t; } } for(int i=0;i<p;i++){ scanf("%d",&t); if(b[t]){ printf("%d\n",b[t]); } else printf("Yes\n"); } } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 520ms, 内存消耗: 1592K, 提交时间: 2018-12-09 13:22:52
#include<bits/stdc++.h> using namespace std; int n,m,x,i,y,k,a[1000001],b[1000001]; int main() { while(cin>>n>>m>>k) { for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=m;i++) { cin>>x>>y; if(a[x]>=y){b[i]=0;a[x]-=y;} else{b[i]=y-a[x];a[x]=0;} } for(i=1;i<=k;i++) { cin>>x; if(b[x]==0)cout<<"Yes"<<endl; else cout<<b[x]<<endl; } } return 0; }