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