[HDOJ]BestCoder Round #61

[HDOJ5522]Numbers

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5522

数据范围n<=100,暴力枚举即可。担心卡常数做了一下常数的优化。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19 
20 using namespace std;
21 
22 const int maxn = 111;
23 int a[maxn];
24 int n;
25 
26 inline bool scan_d(int &num) {
27         char in;bool IsN=false;
28         in=getchar();
29         if(in==EOF) return false;
30         while(in!='-'&&(in<'0'||in>'9')) in=getchar();
31         if(in=='-'){ IsN=true;num=0; }
32         else num=in-'0';
33         while(in=getchar(),in>='0'&&in<='9') {
34             num*=10,num+=in-'0';
35         }
36         if(IsN) num=-num;
37         return true;
38 }
39 
40 int main() {
41     while(scan_d(n)) {
42         for(int i = 0; i < n; i++) scan_d(a[i]);
43         sort(a, a+n);
44         int flag = 0;
45         for(int i = 0; i < n; i++) {
46             if(flag) break;
47             for(int j = i; j < n; j++) {
48                 if(flag) break;
49                 for(int k = 0; k < n; k++) {
50                     if(k == i || k == j || i == j) continue;
51                     if(a[j] - a[i] == a[k])    {
52                         flag = 1;
53                         break;
54                     }
55                 }
56             }
57         }
58         flag ? printf("YES\n") : printf("NO\n");;
59     }
60 }

 

[HDOJ5523]Game

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5523

可以想到最坏的情况就是起点和终点在非边界的两侧且不相邻,那么这样会把宝石分为三段,这样必须使用两次超能力。如果起点终点相邻,那么只需要使用一次超能力。如果起点终点分别在两端,那么不需要使用超能力。如果起点终点位置一样,那么默认起点是被遍历到了的,再也无法走到起(终)点,此时无解(前提是n>1)。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19 
20 using namespace std;
21 
22 inline bool scan_d(int &num) {
23         char in;bool IsN=false;
24         in=getchar();
25         if(in==EOF) return false;
26         while(in!='-'&&(in<'0'||in>'9')) in=getchar();
27         if(in=='-'){ IsN=true;num=0; }
28         else num=in-'0';
29         while(in=getchar(),in>='0'&&in<='9') {
30             num*=10,num+=in-'0';
31         }
32         if(IsN) num=-num;
33         return true;
34 }
35 
36 int n, s, t;
37 
38 int main() {
39     // freopen("in", "r", stdin);
40     while(scan_d(n) && scan_d(s) && scan_d(t)) {
41         if(s == t && n != 1) printf("-1\n");
42         else if((s == 1 && t == n) || (s == n && t == 1)) printf("0\n");
43         else if(s == 1 || s == n || abs(s - t) == 1) printf("1\n");
44         else printf("2\n");
45     }
46 }

 

 

[HDOJ5524]Subtree

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5524

问一棵完全二叉树有多少种子树包含的节点数量不同。

首先可以肯定的是,一棵完全二叉树有可能是满二叉树,满二叉树的子树依然是满二叉树。但是完全二叉树的子树有一棵是满二叉树,另一棵是完全二叉树。根据给定节点数量很轻易可以知道左右子树的形态,然后递归求解。n的数量太大要用long long。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19 
20 using namespace std;
21 
22 typedef long long ll;
23 ll n;
24 set<ll> ans;
25 
26 void dfs(ll x) {
27     if(x == 0 || ans.count(x) > 0) {
28         return;
29     }
30     ans.insert(x);
31     if(--x % 2 == 0) {
32         dfs(x / 2);
33     }
34     else {
35         dfs(x / 2);
36         dfs(x / 2 + 1);
37     }
38 }
39 
40 int main() {
41     // freopen("in", "r", stdin);
42     while(~scanf("%I64d", &n)) {
43         ans.clear();
44         dfs(n);
45         printf("%d\n", ans.size());
46     }
47     return 0;
48 }

 

转载于:https://www.cnblogs.com/kirai/p/4926384.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值