记录一下hdu的几道题
Posted y119777
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一下hdu的几道题相关的知识,希望对你有一定的参考价值。
杭州电子科技大学程序设计竞赛 2016‘12-网络同步赛
前几天看到这个比赛,想着要是到时候没事就做一下,但是中午实在太困,加上水平太次,才a了4道题目。
说明:我是看ac人数多少的顺序来做题的。
1.1001 BigZhuGod的粉丝
没写输入与输出,看例子,找规律!注意一行字符输入的方法。我一般是用getline(cin, s),但是一般会得到\'\\n\',可能需要先getchar()处理一下。
2. 1007 反差萌
看题意,输入2*n个数,然后排序,求和就完了!我刚开始一直无法ac,才发现,我只开了n大小的数组,而实际的输入大小是n*2的,这点注意一下。
3. 1002 递增数
这个题目,我认为有点难度,看完题目后,我就吓坏了,不知道怎么做!但是还得静下心来仔细分析!这不就是简单的数个数么。
跟这道题目挺相似的,https://leetcode.com/problems/k-th-smallest-in-lexicographical-order/ 这个也是不会做,好像现在也不会做哎!
分析:求长度为1的递增数的个数,长度为2,长度为3,由于最大1e8,长度最大为8,那么对于x = 1234,结果包含长度为3,2,1的递增数,首先考虑这个怎么计算。
长度为1的就是9个,长度为2,依次枚举首位的数字,由于是递增数,后续的数字,需要大于等于这个数字,那么,我们要求的可以转化为求长度为k,以a开头的递增数的个数,这个问题容易处理。
长度为1的,以a开头的递增数为10-a,长度为k的,以a开头的递增数包括:以a+1开头的,长度为k的和以a开头的,长度为k-1的递增数的和。这个问题就解决了,求长度为k的也很容易解决。
接下来考虑对于x= 1234, 如何求长度为4的递增数,第一位不能为0,所以第一位只能为1,接下来考虑第二位,基于第一位,要大于等于上一位,说以先求解[1,2),这个可以通过上面的方法,利用区间减法得到,然后接下来需要考虑的就是第二位为2的情况,依次往后考虑。
讲的有点乱,具体看代码:
1 /* 2 ID: y1197771 3 PROG: test 4 LANG: C++ 5 */ 6 #include<bits/stdc++.h> 7 #define pb push_back 8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 10 typedef long long ll; 11 using namespace std; 12 typedef pair<int, int> pii; 13 const int maxn = 2e3 + 10; 14 map<pii, ll> ma; 15 ll work(int x, int len) { 16 if(len <= 0 || x == 0) return 0; 17 if(len == 1) return 10 - x; 18 if(len == 2) { 19 ll t = 0; 20 if(x + 1 <= 9) t += work(x + 1, len); 21 t += work(x, len - 1); 22 return ma[{x, len} ] = t; 23 } 24 ll res = 0; 25 if(x + 1 <= 9) res += work(x + 1, len); 26 res += work(x, len - 1); 27 return ma[{x, len} ] = res; 28 } 29 void solve() { 30 int x; 31 ll res = 0; 32 cin >> x; 33 int len = 0; 34 int t = x; 35 int lb = x; 36 vector<int> v; 37 while(t) { 38 v.pb(t % 10); 39 len ++; t /= 10; 40 } 41 reverse(v.begin(), v.end()); 42 for (int i = 1; i < len; i++) 43 res += work(1, i); 44 int lst = 1; 45 int i = 0; 46 for (i = 0; i < v.size(); i++) { 47 if(v[i] <= 0 || v[i] < lst) break; 48 res += work(lst, len - i) - work(v[i], len - i); 49 lst = v[i]; 50 } 51 if(i == v.size()) res++; 52 cout << res << endl; 53 54 } 55 int main() { 56 freopen("test.in", "r", stdin); 57 //freopen("test.out", "w", stdout); 58 //ios::sync_with_stdio(0); 59 //cin.tie(0); cout.tie(0); 60 int _; cin >> _; 61 while(_--) 62 solve(); 63 return 0; 64 }
4. 1004 我要拿走你的蜡烛
简单的暴力枚举。
1 /* 2 ID: y1197771 3 PROG: test 4 LANG: C++ 5 */ 6 #include<bits/stdc++.h> 7 #define pb push_back 8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 10 typedef long long ll; 11 using namespace std; 12 typedef pair<int, int> pii; 13 const int maxn = 1e3 + 10; 14 int n, m; 15 int a[20]; 16 int tag[4] = {4, 2, 2, 4}; 17 int s[20]; 18 void solve() { 19 string st; 20 cin >> n >> m; 21 for (int i = 0; i < n; i++) { 22 cin >> st; 23 if(st[0] == \'F\') a[i] = 0; 24 if(st[0] == \'I\') a[i] = 1; 25 if(st[0] == \'D\') a[i] = 2; 26 if(st[0] == \'E\') a[i] = 3; 27 } 28 bool f = 0; 29 for (int i = 0; i < (1 << n); i++) { 30 int cost = 0; 31 memset(s, 0, sizeof s); 32 //a1 = a2 = a3 = a4 = 0; 33 for (int j = 0; j < n; j++) { 34 if(i & (1 << j)) { 35 cost += tag[a[j] ]; 36 s[a[j] ]++; 37 } 38 } 39 //cout << i << " " << cost << endl; 40 if(cost > 10) continue; 41 //for (int j = 0; j < 4; j++) cout << s[j] << endl; 42 int d = s[2] + 2 * s[3]; 43 44 int res = (6 + d) * s[0] + (3 + d) * s[1]; 45 if(res >= m) { 46 f = 1; break; 47 } 48 } 49 if(f) cout << "Yes" << endl; 50 else cout << "No" << endl; 51 } 52 int main() { 53 freopen("test.in", "r", stdin); 54 //freopen("test.out", "w", stdout); 55 ios::sync_with_stdio(0); 56 cin.tie(0); cout.tie(0); 57 int _; cin >> _; 58 while(_--) 59 solve(); 60 return 0; 61 }
这个做完,大概就4:15,然后看了看1003 洗衣服,简单分析下,一看时间到了,也没想出怎么做。中间还耽搁了大概1小时,去睡觉,最后结果算一般把,估计正常做也就这个水平!
以上是关于记录一下hdu的几道题的主要内容,如果未能解决你的问题,请参考以下文章