程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 挑戰程序1.6.3,挑戰1.6.3

挑戰程序1.6.3,挑戰1.6.3

編輯:C++入門知識

挑戰程序1.6.3,挑戰1.6.3


 

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved