題目:有n張紙片,隨機取4張(可放回),如4張面值加起來可等於m,則輸出yes,否則no。紙片的面值為k[1],k[2]……
思路:使用4次循環尋找會導致超時,所以假設4張分別為a,b,c,d,
先計算二次循環a+b所有可能放入數組kk,然後將kk排序,
最後使用二次循環(m-c-d)與kk用二分法比較,,最後確定是否有這個值。
方法:二分法,依次檢索法。
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 bool ss(int x); 5 void solve(); 6 int n,m,r,k[500]; 7 int kk[500]; 8 bool f; 9 int main() 10 { 11 while(scanf("%d %d",&n,&m)!=EOF) 12 { 13 for(int i=0;i<n;i++) 14 scanf("%d",&k[i]); 15 solve(); 16 if(f) printf("Yes\n"); 17 else printf("NO\n"); 18 } 19 return 0; 20 } 21 22 void solve() 23 { 24 for(int a=0;a<n;a++) 25 for(int b=0;b<n;b++) 26 kk[a*n+b]=k[a]+k[b]; 27 sort(kk,kk+n*n); 28 f=false; 29 for(int c=0;c<n;c++) 30 for(int d=0;d<n;d++) 31 if(ss(m-k[c]-k[d])) 32 { 33 f=true; 34 } 35 } 36 37 bool ss(int x) 38 { 39 int l=0;r=n*n; 40 while(r-l>=1) 41 { 42 int i=(r+l)/2; 43 if(kk[i]>x)l=i+1; 44 else if (kk[i]==x) return true; 45 else r=i; 46 } 47 }
Tip:此題也可以使用檢索a然後排序,然後(m-b-c-d)與a用二分法比較,套路差不多,但是第一種方法的思想明顯比較高大上。
對了,局部變量可以與全局變量重名,但是局部變量會屏蔽全局變量哦!!
每日小知識:
具體來說,全局變量和局部變量的區別如下:
1. 作用域不同:全局變量的作用域為整個程序,而局部變量的作用域為當前函數或循環等
2. 內存存儲方式不同:全局變量存儲在全局數據區中,局部變量存儲在棧區
3. 生命期不同:全局變量的生命期和主程序一樣,隨程序的銷毀而銷毀,局部變量在函數內部或循環內部,隨函數的退出或循環退出就不存在了
4. 使用方式不同:全局變量在聲明後程序的各個部分都可以用到,但是局部變量只能在局部使用。函數內部會優先使用局部變量再使用全局變量