列表

详情


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;
}

上一题