題目:有n張紙片,隨機取4張(可放回),如4張面值加起來可等於m,則輸出yes,否則no。紙片的面值為k[1],k[2]…… 思路:使用4次迴圈尋找會導致超時,所以假設4張分別為a,b,c,d, 先計算二次迴圈a+b所有可能放入數組kk,然後將kk排序, 最後使用二次迴圈(m-c-d)與kk用二分法 ...
題目:有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. 使用方式不同:全局變數在聲明後程式的各個部分都可以用到,但是局部變數只能在局部使用。函數內部會優先使用局部變數再使用全局變數