BNU 29376——砂漠の旅——————【技巧題】
2444 ワード
砂漠の旅
Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:
%lld Java class name: Main
Submit
Status
「小太りは砂漠を通り抜けなければならない.小太りは大吉普を運転している.小太りのジープは燃費が高く、ジープは油を4バレル入れることができる」.
これが誰もが歌う砂漠の歌~~小太りで群を抜く聡明な知恵を体現している.
太った問題は、今は車を運転して砂漠を通り抜ける必要があり、総走行距離はLです.小太りのジープは油をいっぱい入れてX距離を走ることができ、同時にそのトランクは最大4バレルの油を置くことができる.起点にはN種類のガソリンがあり、それぞれのガソリンには無限のバケツがあり、1バケツで距離Aiを走ることができます.今、太っている人は、ちょうど4バレルの油を持っていて、出発前にいっぱいの油を加えて、ちょうどL距離を走ることができるかどうかを知りたいと思っています.
Input
1行目の正の整数T(1<=T<=50)は、データのグループ数を表す.
次にT組のデータは,各組のデータの1行目が3つの整数L(1<=L<=1000),X(1<=X<=L),N(1<=N<=1000)である.
次のN行は、1行に1つの正の整数Ai(1<=Ai<=1000)で、i番目のガソリンが1バレルで走行できる距離を表す.
Output
データのセットごとに1行ずつ出力する場合は「Yes」、そうでなければ「No」を出力します
Sample Input
Sample Output
Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:
%lld Java class name: Main
Submit
Status
「小太りは砂漠を通り抜けなければならない.小太りは大吉普を運転している.小太りのジープは燃費が高く、ジープは油を4バレル入れることができる」.
これが誰もが歌う砂漠の歌~~小太りで群を抜く聡明な知恵を体現している.
太った問題は、今は車を運転して砂漠を通り抜ける必要があり、総走行距離はLです.小太りのジープは油をいっぱい入れてX距離を走ることができ、同時にそのトランクは最大4バレルの油を置くことができる.起点にはN種類のガソリンがあり、それぞれのガソリンには無限のバケツがあり、1バケツで距離Aiを走ることができます.今、太っている人は、ちょうど4バレルの油を持っていて、出発前にいっぱいの油を加えて、ちょうどL距離を走ることができるかどうかを知りたいと思っています.
Input
1行目の正の整数T(1<=T<=50)は、データのグループ数を表す.
次にT組のデータは,各組のデータの1行目が3つの整数L(1<=L<=1000),X(1<=X<=L),N(1<=N<=1000)である.
次のN行は、1行に1つの正の整数Ai(1<=Ai<=1000)で、i番目のガソリンが1バレルで走行できる距離を表す.
Output
データのセットごとに1行ずつ出力する場合は「Yes」、そうでなければ「No」を出力します
Sample Input
1
20 9 2
2
3
Sample Output
Yes
#include<bits/stdc++.h>
using namespace std;
int a[2000];
bool flag[2000];
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(flag,0,sizeof(flag));
int l,x,n;
scanf("%d%d%d",&l,&x,&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
flag[a[i]]=1;
}
int ans=l-x;
bool Flag=0;
sort(a,a+n);
for(int i=0;i<n;i++){
if(a[i]>ans)
break;
for(int j=0;j<n;j++){
if(a[i]+a[j]>ans)
break;
for(int k=0;k<n;k++){
if(a[i]+a[j]+a[k]>ans)
break;
int tmp=ans-a[i]-a[j]-a[k];
if(flag[tmp]){
Flag=1;
break;
}
}
if(Flag)
break;
}
if(Flag)
break;
}
if(Flag)
printf("Yes
");
else
printf("No
");
}
return 0;
}