A题
简单模拟。
1 /************************************************************************* 2 > File Name: A.cpp 3 > Author: Stomach_ache 4 > Mail: [email protected] 5 > Created Time: 2014年09月01日 星期一 08时08分12秒 6 > Propose: 7 ************************************************************************/
8
9 #include <cmath>
10 #include <string>
11 #include <cstdio>
12 #include <string>
13 #include <fstream>
14 #include <cstring>
15 #include <iostream>
16 #include <algorithm>
17 using namespace std; 18 /*Let's fight!!!*/
19
20 int n; 21 string s; 22 double a, f; 23
24 int main(void) { 25 while (cin >> n) { 26 cin >> s; 27 cin >> a >> f; 28
29 double sum = 0.0; 30 int m = (int)s.length(); 31 bool flag = true; 32 for (int i = 0; i < m; i++) { 33 if (s[i] == 'L') sum -= a; 34 else sum += a; 35 if (sum >= f || sum <= -f) {flag = false; break;} 36 } 37 printf("%s\n", flag ? "YES" : "NO"); 38 } 39
40 return 0; 41 }
B题
判断最大值和剩下的值的和的关系
1 /************************************************************************* 2 > File Name: B.cpp 3 > Author: Stomach_ache 4 > Mail: [email protected] 5 > Created Time: 2014年09月01日 星期一 14时26分17秒 6 > Propose: 7 ************************************************************************/
8
9 #include <cmath>
10 #include <string>
11 #include <cstdio>
12 #include <fstream>
13 #include <cstring>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std; 17 /*Let's fight!!!*/
18
19 int n, m; 20
21 int main(void) { 22 ios::sync_with_stdio(false); 23 while (cin >> m >> n) { 24 long long sum = 0, t = -1, a; 25 for (int i = 0; i < m; i++) cin >> a, t = max(t, a), sum += a; 26 sum -= t; 27 if (t > sum + 1) cout << "NO\n"; 28 else cout << "YES\n"; 29 } 30 return 0; 31 }
C题
模拟。
1 /************************************************************************* 2 > File Name: C.cpp 3 > Author: Stomach_ache 4 > Mail: [email protected] 5 > Created Time: 2014年09月01日 星期一 14时32分40秒 6 > Propose: 7 ************************************************************************/
8 #include <map>
9 #include <cmath>
10 #include <string>
11 #include <vector>
12 #include <cstdio>
13 #include <fstream>
14 #include <cstring>
15 #include <iostream>
16 #include <algorithm>
17 using namespace std; 18 /*Let's fight!!!*/
19
20 int vis[100050]; 21
22 int main(void) { 23 ios::sync_with_stdio(false); 24 int n; 25 while (cin >> n) { 26 map<string, int> var; 27 vector<string> s(n + 1); 28 for (int i = 1; i <= n; i++) cin >> s[i]; 29 memset(vis, 0, sizeof(vis)); 30
31 for (int i = 1; i <= n; i++) { 32 if (var.find(s[i]) == var.end()) var[s[i]] = 1; 33 else var[s[i]]++; 34 if (!vis[var[s[i]]]) vis[var[s[i]]] = i; 35 } 36 for (int i = 1; i <= n && vis[i]; i++) cout << i << ' ' << s[vis[i]] << endl; 37 } 38
39 return 0; 40 }
D题
从后往前计算,判断当前点在左上或者右上或者左下或者右下,然后分别乘以不同的系数,并且更新点的位置。
1 /************************************************************************* 2 > File Name: D.cpp 3 > Author: Stomach_ache 4 > Mail: [email protected] 5 > Created Time: 2014年09月01日 星期一 14时56分31秒 6 > Propose: 7 ************************************************************************/
8
9 #include <cmath>
10 #include <string>
11 #include <cstdio>
12 #include <fstream>
13 #include <cstring>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std; 17 /*Let's fight!!!*/
18
19 int t, a, b, c, d, x, y; 20 typedef long long LL; 21
22 int main(void) { 23 ios::sync_with_stdio(false); 24 cin >> t; 25 while (t--) { 26 int n; 27 cin >> n; 28 cin >> a >> b >> c >> d; 29 cin >> x >> y; 30
31 int times = 0; 32 while ((1<<times) < max(x, y)) times++; 33 LL ans = 1; 34 while (times--) { 35 if (x <= (1<<times)) { 36 if (y <= (1<<times)) ans *= a; 37 else ans *= b, y -= 1<<times; 38 } else { 39 x -= 1<<times; 40 if (y <= (1<<times)) ans *= c; 41 else ans *= d, y -= 1<<times; 42 } 43 } 44 cout << ans << endl; 45 } 46
47 return 0; 48 }
E题
比赛时候没有过。可以先枚举角度(从0到2*pi,每次加1e-7,加多了就会WA),求得系数。
1 /************************************************************************* 2 > File Name: E.cpp 3 > Author: Stomach_ache 4 > Mail: [email protected] 5 > Created Time: 2014年09月01日 星期一 15时34分16秒 6 > Propose: 7 ************************************************************************/
8
9 #include <cmath>
10 #include <string>
11 #include <cstdio>
12 #include <fstream>
13 #include <cstring>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std; 17 /*Let's fight!!!*/
18
19 int main(void) { 20 /*double ans; 21 ans=0.0; 22 double pi = acos(-1.0); 23 for (double i = 0.0; i < 2 * pi; i += 0.0000001) 24 { 25 ans += sqrt(5.0 - 4.0 * cos(i)); 26 } 27 ans /= 2 * pi * 10000000; 28 cout << ans << endl; */
29 int r; 30 while (cin >> r) cout << (int)(r * 2.12709) <<endl; 31 return 0; 32 }
F题
因为y-x < 1e4,以此作为着手点。先去掉Ai中大于y-x+1的系数,然后去重。
之后就转化为完全背包。
1 /************************************************************************* 2 > File Name: F.cpp 3 > Author: Stomach_ache 4 > Mail: [email protected] 5 > Created Time: 2014年09月01日 星期一 19时14分48秒 6 > Propose: 7 ************************************************************************/
8 #include <set>
9 #include <cmath>
10 #include <string>
11 #include <cstdio>
12 #include <fstream>
13 #include <vector>
14 #include <cstring>
15 #include <iostream>
16 #include <algorithm>
17 using namespace std; 18 /*Let's fight!!!*/
19
20 int n, x, y, dp[10005]; 21
22 int main(void) { 23 ios::sync_with_stdio(false); 24 while (cin >> n) { 25 cin >> x >> y; 26 int cnt = 0; 27 vector<int> a; 28 for (int i = 1; i <= n; i++) { 29 int tmp; 30 cin >> tmp; 31 if (tmp <= y - x + 1) a.push_back(tmp - 1); 32 } 33 sort(a.begin(), a.end()); 34 a.erase(unique(a.begin(), a.end()), a.end()); 35 cnt = a.size(); 36 memset(dp, 0x3f, sizeof(dp)); 37 int V = y - x; 38 dp[0] = 0; 39 for (int i = 0; i < cnt; i++) { 40 for (int j = a[i]; j <= V; j++) { 41 if (dp[j - a[i]] != 0x3f3f3f3f) dp[j] = min(dp[j], dp[j - a[i]] + a[i]); 42 } 43 } 44 if (dp[V] == 0x3f3f3f3f) puts("IMPOSSIBLE"); 45 else puts("POSSIBLE"); 46
47 } 48
49 return 0; 50 }
H题
给n个不大于1e9的数,要求找出2个数使得这两个数进行没有进位的加法的结果最大。
思路:用Trie树维护每一个数,初始时树为空,没输入一个数,先在树中找某个数与之进行无进位加法可以得到的最大值,
更新最大值,然后将该数加进树中。
下面就是如何找到与某个数进行加法可以得到的最大值,从高位枚举到低位,肯定优先满足最高位最大,这样才能使得结果最大,
对于每一位,降序枚举进行加法可以得到的和,就是9到0,看能否满足,如果满足就跳出并判断下一位,并更新结果。
Accepted Code:
1 /************************************************************************* 2 > File Name: H.cpp 3 > Author: Stomach_ache 4 > Mail: [email protected] 5 > Created Time: 2014年09月02日 星期二 20时27分32秒 6 > Propose: 7 ************************************************************************/ 8 #include <cmath> 9 #include <string> 10 #include <cstdio> 11 #include <fstream> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 using namespace std; 16 /*Let's fight!!!*/ 17 18 #define rep(i, n) for (int i = (0); i < (n); i++) 19 #define per(i, n) for (int i = (n); i > 0; i--) 20 #define FOR(i, n) for (int i = (1); i <= (n); i++) 21 #define ROF(i, n) for (int i = (n); i >= (1); i--) 22 const int MAX_N = 1000050; 23 int ch[MAX_N][12], p[12]; 24 struct Trie { 25 int sz; 26 Trie() { 27 memset(ch[0], -1, sizeof(ch[0])); 28 sz = 1; 29 } 30 void insert(int num) { 31 int u = 0; 32 for (int i = 8; i >= 0; i--) { 33 int id = num / p[i]; 34 if (id >= 10) id %= 10; 35 if (ch[u][id] == -1) { 36 memset(ch[sz], -1, sizeof(ch[sz])); 37 ch[u][id] = sz++; 38 } 39 u = ch[u][id]; 40 } 41 } 42 int find_max(int num) { 43 int u = 0, ans = 0; 44 for (int i = 8; i >= 0; i--) { 45 int id = num / p[i]; 46 if (id >= 10) id %= 10; 47 for (int j = 9; j >= 0; j--) { 48 int tmp = j - id; 49 tmp = (tmp + 10) % 10; 50 if (ch[u][tmp] != -1) { 51 ans += p[i] * j; 52 u = ch[u][tmp]; 53 break; 54 } 55 } 56 } 57 return ans; 58 } 59 }; 60 61 int main(void) { 62 ios_base::sync_with_stdio(false); 63 p[0] = 1; 64 FOR (i, 9) p[i] = p[i - 1] * 10; 65 int n; 66 while (cin >> n) { 67 Trie A; 68 int ans = -1, num; 69 rep (i, n) { 70 cin >> num; 71 if (i != 0) ans = max(ans, A.find_max(num)); 72 A.insert(num); 73 } 74 cout << ans << endl; 75 } 76 77 return 0; 78 }