Description
n n 个城市,第个城市可以买到 ai a i 瓶果汁,第 i i 个城市到第个城市需要走 bi b i 天,每天需要喝 m m 瓶果汁,问能否在保证路上每天都有果汁喝的情况下从城市到 n n 城市
Input
第一行一整数表示用例组数,每组用例首先输入一整数 n n 表示城市个数,之后输入个整数 a1,...,an a 1 , . . . , a n 表示 n n 个城市每个城市可以买到的果汁数,最后输入个整数 b1,...,bn−1 b 1 , . . . , b n − 1 ,其中 bi b i 表示 i i 城市到城市所需用时,所有值不超过 1000 1000
Output
如果可以保证每天喝果汁的情况下从 1 1 城市到城市则输出 Yes Y e s ,否则输出 No N o
Sample Input
2
4 1
3 2 1 4
1 2 3
4 2
2 4 6 8
3 2 1
Sample Output
Yes
No
Solution
简单题,只要判断是否对于任意 2≤i≤n 2 ≤ i ≤ n 有 ∑j=1i−1aj≥m⋅∑j=1i−1bj ∑ j = 1 i − 1 a j ≥ m ⋅ ∑ j = 1 i − 1 b j ,维护 a,b a , b 序列前缀和即可
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=1005;
int T,n,m,a[maxn],b[maxn];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]+=a[i-1];
for(int i=1;i<n;i++)scanf("%d",&b[i]),b[i]+=b[i-1];
int flag=1;
for(int i=2;i<=n;i++)
if(a[i-1]<b[i-1]*m)flag=0;
printf("%s\n",flag?"Yes":"No");
}
return 0;
}