題目:有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. 使用方式不同:全局變量在聲明後程序的各個部分都可以用到,但是局部變量只能在局部使用。函數內部會優先使用局部變量再使用全局變量