[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 }