沙漠之旅Time Limit: 1000msMemory Limit: 65536KB64-bit integer IO format:
%lld Java class name:
Main Prev Submit
Status
Statistics
Discuss
Next
“小胖要穿越一片沙漠,小胖開著一輛大吉普,小胖的吉普油耗高,吉普能放四桶油。”
這就是人人會唱的沙漠之歌~~體現了小胖拔群的聰明才智。
小胖的問題是這樣的:現在需要駕車穿越一片沙漠,總的行駛路程為L。小胖的吉普裝滿油能行駛X距離,同時其後備箱最多能放下四桶油。在起點有N種汽油,每種汽油都有無限桶,一桶能行駛距離Ai。現在小胖想知道:能不能恰好帶四桶油,再加上出發前裝滿的油,使得恰好能行駛L距離。
Input
第一行一個正整數T(1 <= T <= 50),表示資料的組數。
接下來T組資料,每組資料的第一行是三個整數L(1 <= L <= 1000),X(1 <= X <= L),N(1 <= N <= 1000)。
接下來N行,每行一個正整數Ai(1 <= Ai <= 1000),表示第i種汽油一桶能行駛的距離。
Output
對於每組資料輸出一行,若能輸出“Yes”,否則輸出“No”
Sample Input
120 9 223
Sample Output
Yes
Source 第十一屆北京師範大學程式設計競賽決賽 Author zhaoli
題目大意:解方程:ai1+ai2+ai3+ai4=l-x;
思路:枚舉兩兩之間的組合,10^6的時間效率,50組資料是可以過的,但是用map竟然會逾時,暈死.
還有一個小小的trick:就是尋找結果的時候,不必枚舉完所有10^6的組合,只需要枚舉1~l-x內的數即可,因為兩兩之間的組合+兩兩之間的組合必定要等於l-x才是結果
AC Program:
#include<stdio.h> #include<string.h> #include<map> using namespace std;int a[1005];int mm[2100];int main(){ int test; scanf("%d",&test); while(test--){ int l,x,n; scanf("%d%d%d",&l,&x,&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } //map<int,int>mm; memset(mm,0,sizeof(mm)); //int kg=0; int tmp; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ //sum[kg]=a[i]+a[j]; tmp=a[i]+a[j]; //mm[tmp]=1; mm[tmp]=1; //kg++; } } //sort(sum,sum+kg); int flag=0; int t=l-x; for(int i=1;i<t;i++){ //if(sum[i]>t)break; //if(mm[t-sum[i]]==1){ if(mm[i] && mm[t-i]){ printf("Yes\n"); //goto end; flag=1; break; } } if(!flag) printf("No\n"); //end:; } //system("pause"); return 0;}