准备每天刷两题PAT真题
1001 A+B Format
模拟输出,注意格式
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 string ans = ""; 8 9 int main() { 10 int a, b, c, cnt = 0; 11 cin >> a >> b; 12 c = a + b; 13 if(c == 0) { 14 cout << 0 << endl; 15 return 0; 16 } 17 while(c) { 18 if(cnt % 3 == 0 && cnt != 0) ans = ans + ","; 19 char ch = abs(c % 10) + '0'; 20 ans = ans + ch; 21 c /= 10; 22 cnt++; 23 } 24 reverse(ans.begin(), ans.end()); 25 if(a + b < 0) ans = "-" + ans ; 26 cout << ans << endl; 27 return 0; 28 }
1002 A+B for Polynomials
map存数,注意系数正负。
1 #include <map> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 map<int, double> m; 9 10 int main() { 11 double a; 12 int k, n, cnt = 0, mx = 0; 13 scanf("%d", &k); 14 for(int i = 1; i <= k; i++) { 15 scanf("%d%lf", &n, &a); 16 mx = max(mx, n); 17 m[n] = m[n] + a; 18 } 19 scanf("%d", &k); 20 for(int i = 1; i <= k; i++) { 21 scanf("%d%lf", &n, &a); 22 mx = max(mx, n); 23 m[n] = m[n] + a; 24 } 25 for(int i = mx; i >= 0; i--) { 26 if(m[i] != 0) cnt++; 27 } 28 printf("%d", cnt); 29 for(int i = mx; i >= 0; i--) { 30 if(m[i] != 0) printf(" %d %.1f", i, m[i]); 31 } 32 return 0; 33 }
1003 Emergency
单调队列优化dijkstra,注意标记点,路径长度相同,当前点增加路径数目,同时更新当前点人员数目。
1 #include <queue> 2 #include <vector> 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 const int N = 500 + 10; 10 bool vis[N]; 11 int a[N], cnt[N], sum[N], d[N]; 12 int n, m, c1, c2; 13 vector< pair<int, int> > E[N]; 14 15 void dijkstra() { 16 priority_queue< pair<int, int> > Q; 17 Q.push( make_pair(0, c1) ); 18 memset(d, 0x3f, sizeof(d)); 19 d[c1] = 0; cnt[c1] = 1; sum[c1] = a[c1]; 20 while(!Q.empty()) { 21 int u = Q.top().second; 22 Q.pop(); 23 if(vis[u]) continue; 24 vis[u] = 1; 25 for(int i = 0; i < E[u].size(); i++) { 26 int v = E[u][i].first; 27 int w = E[u][i].second; 28 if(d[v] > d[u] + w) { 29 d[v] = d[u] + w; 30 cnt[v] = cnt[u]; 31 sum[v] = sum[u] + a[v]; 32 Q.push( make_pair(-d[v], v) ); 33 } 34 else if(d[v] == d[u] + w) { 35 cnt[v] += cnt[u]; 36 sum[v] = max(sum[v], sum[u] + a[v]); 37 Q.push( make_pair(-d[v], v) ); 38 } 39 } 40 } 41 42 } 43 44 int main() { 45 scanf("%d %d %d %d", &n, &m, &c1, &c2); 46 for(int i = 0; i < n; i++) { 47 scanf("%d", &a[i]); 48 } 49 for(int i = 1; i <= m; i++) { 50 int u, v, w; 51 scanf("%d %d %d", &u, &v, &w); 52 E[u].push_back(make_pair(v, w)); 53 E[v].push_back(make_pair(u, w)); 54 } 55 dijkstra(); 56 printf("%d %d", cnt[c2], sum[c2]); 57 return 0; 58 }
1004 Counting Leaves
遍历树,在每个深度纪录下答案。
1 #include <vector> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N=123; 9 vector<int> E[N]; 10 int ans[N], mx = 0; 11 12 void dfs(int u, int fa, int level) { 13 if(E[u].size()==0) { 14 mx = max(mx, level); 15 ans[level]++; 16 return ; 17 } 18 for(int i = 0; i < E[u].size(); i++){ 19 int v = E[u][i]; 20 if(v != fa) dfs(v, u, level + 1); 21 } 22 } 23 24 int main() { 25 int n, m; 26 scanf("%d %d", &n, &m); 27 for(int i = 1; i <= m; i++) { 28 int u, v, k; 29 scanf("%d %d", &u, &k); 30 for(int j = 1; j <= k; j++) { 31 scanf("%d", &v); 32 E[u].push_back(v); 33 } 34 } 35 dfs(1, 0, 1); 36 printf("%d", ans[1]); 37 for(int i = 2; i <= mx; i++){ 38 printf(" %d", ans[i]); 39 } 40 return 0; 41 }
1005 Spell It Right
每位数字加起来,转成英文直接输出就好,注意特判0的情况
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 string s; 6 string str[10]={"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; 7 int ans[123]; 8 9 int main() { 10 int num = 0, cnt = 0; 11 cin >> s; 12 for(int i = 0; i < s.size(); i++) { 13 num = num + (s[i] - '0'); 14 } 15 if(num == 0) { 16 cout << str[0]; 17 return 0; 18 } 19 while(num) { 20 ans[cnt++] = num % 10; 21 num /= 10; 22 } 23 for(int i = cnt - 1; i >= 0 ; i--){ 24 cout << str[ ans[i] ] ; 25 if(i != 0) cout << " " ; 26 } 27 return 0; 28 }
1006 Sign In and Sign Out
直接把时间转成数字,大小比较,更新答案。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int INF = 0x3f3f3f3f; 7 char s[20], ans1[20], ans2[20]; 8 9 int main() { 10 int n, mi = INF, mx = 0; 11 scanf("%d", &n); 12 for(int i = 1; i <= n; i++) { 13 int a, b, c, d, e, f; 14 scanf("%s %d:%d:%d %d:%d:%d", s, &a, &b, &c, &d, &e, &f); 15 a = a * 10000 + b * 100 + c; 16 d = d * 10000 + e * 100 + f; 17 if(a < mi) { 18 mi = a; 19 strcpy(ans1, s); 20 } 21 if(d > mx) { 22 mx =d; 23 strcpy(ans2, s); 24 } 25 } 26 printf("%s %s", ans1, ans2); 27 return 0; 28 }
1007 Maximum Subsequence Sum
最大子段和,动态规划的一个想法。一直累加,加到小于0,重置为0,从下个开始重新加。
注意坑点:全负输出最前面和最后面的数字;数字全部<=0,并至少有一个0,输出0 0 0。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long ll; 8 const int N = 1e4 + 10; 9 ll a[N]; 10 11 int main() { 12 ll k, l, r, ans = 0, sum = 0; 13 scanf("%lld", &k); 14 for(int i = 1; i <= k; i++) { 15 scanf("%lld", &a[i]); 16 } 17 l = a[1]; r = a[k]; 18 for(int i = 1; i <= k; i++) { 19 sum += a[i]; 20 if(sum < 0) sum = 0; 21 if(sum > ans) { 22 ans = sum; 23 r = a[i]; 24 } 25 } 26 if(ans == 0) { 27 for(int i = 1; i <= k; i++) { 28 if(a[i] == 0) { 29 //-1 0 -1 30 printf("0 0 0"); 31 return 0; 32 } 33 } 34 //-1 -1 -1 35 printf("%lld %lld %lld", ans, l, r); 36 return 0; 37 } 38 for(int i = 1; i <= k; i++) { 39 if(a[i] == r) { 40 sum = 0; 41 for(int j = i; j >= 1; j--) { 42 sum += a[j]; 43 if(sum == ans) { 44 l = a[j]; 45 printf("%lld %lld %lld", ans, l, r); 46 return 0; 47 } 48 } 49 } 50 } 51 return 0; 52 }
1008 Elevator
模拟一下就好了。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 int main() { 8 int n, k, keep = 0, ans = 0; 9 scanf("%d", &n); 10 for(int i = 1; i <= n; i++) { 11 scanf("%d", &k); 12 if( k > keep) { 13 ans += 6 * (k - keep); 14 } else { 15 ans += 4 * (keep - k); 16 } 17 ans += 5; 18 keep = k; 19 } 20 printf("%d", ans); 21 return 0; 22 }
1009 Product of Polynomials
按照要求算出多项式,用map存下。多项式的系数可能为负。
1 #include <map> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 15; 9 int a[N]; 10 double b[N]; 11 map<int, double> m; 12 13 int main() { 14 int k, c, mx = 0, cnt = 0; 15 double d; 16 scanf("%d", &k); 17 for(int i = 1; i <= k; i++) { 18 scanf("%d %lf", &a[i], &b[i]); 19 } 20 scanf("%d",&k); 21 for(int i = 1; i <= k; i++) { 22 scanf("%d %lf", &c, &d); 23 for(int j = 1; j <= k; j++) { 24 mx = max(mx, c + a[j]); 25 m[(c + a[j])] += b[j] * d; 26 } 27 } 28 for(int i = 0; i <= mx; i++) { 29 if(m[i] != 0) cnt++; 30 } 31 printf("%d",cnt); 32 for(int i = mx; i >= 0 ; i--) { 33 if(m[i] != 0) printf(" %d %.1f", i, m[i]); 34 } 35 return 0; 36 }
1010 Radix
先把要判断的数,和另一个数每位上的数字处理出来,然后二分答案。右边界要开到$3*10^9$左右。这精度卡的真严谨呀。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long ll; 8 string s1, s2; 9 ll tag, radix, n1, n2; 10 ll a[15], num = 0, k = 1, l = 0, r = 3e9, ans = 1e18; 11 12 bool check(ll mid) { 13 ll res = 0, tmp = 1; 14 for(int i = n2 - 1; i >= 0; i--) { 15 res = res + a[i] * tmp; 16 tmp *= mid; 17 } 18 if(res == num) ans = min(ans, mid); 19 if(res >= num || res < 0) return true; 20 else return false; 21 } 22 23 int main() { 24 cin >> s1 >> s2 >> tag >> radix; 25 n1 = s1.size(); n2 = s2.size(); 26 27 if(tag == 2) { 28 swap(s1, s2); swap(n1, n2); 29 } 30 31 for(int i = n1 - 1; i >= 0; i--) { 32 if(s1[i] >= 'a' && s1[i] <= 'z') { 33 num = num + ( (s1[i] - 'a') + 10 ) * k; 34 } else { 35 num = num + (s1[i] - '0') * k; 36 } 37 k *= radix; 38 } 39 for(int i = n2 - 1; i >= 0; i--) { 40 if(s2[i] >= 'a' && s2[i] <= 'z') { 41 a[i] = 1LL * ( (s2[i] - 'a') + 10 ); 42 } else { 43 a[i] = 1LL * (s2[i] - '0'); 44 } 45 l = max(l, a[i] + 1); 46 } 47 while(l <= r) { 48 ll mid = (l + r) /2; 49 if(check(mid)) r = mid - 1; 50 else l = mid + 1; 51 } 52 if(ans == 1e18) cout << "Impossible"; 53 else cout << ans; 54 return 0; 55 }
1011 World Cup Betting
按题目模拟一下,照着输出就好。
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 char ans[10]; 7 8 int main() { 9 double a, b, c, res = 0.65; 10 for(int i = 1; i <= 3; i++) { 11 scanf("%lf %lf %lf", &a, &b, &c); 12 if(a >= b && a >= c) ans[i] = 'W', res *= a; 13 else if(b >= a && b >= c) ans[i] = 'T', res *= b; 14 else if(c >= a && c >= b) ans[i] = 'L', res *= c; 15 } 16 res = (res - 1) * 2; 17 for(int i = 1; i <= 3; i++) printf("%c ", ans[i]); 18 printf("%.2f", res); 19 return 0; 20 }
1012 The Best Rank
结构体排序。按题目需要的优先级排序,记录下。判断的时候也按照要求的优先级判断,更新答案。注意存等级顺序的时候,相同分数的应排在同一等级。
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 const int N = 1e6; 7 const int INF = 0x3f3f3f3f; 8 struct node { 9 int id, c, m, e, a; 10 }s[N]; 11 int A[N], C[N], M[N], E[N]; 12 13 bool cmpa(node s1, node s2) { 14 if(s1.a == s2.a) return s1.id < s2.id; 15 return s1.a > s2.a; 16 } 17 18 bool cmpc(node s1, node s2) { 19 if(s1.c == s2.c) return s1.id < s2.id; 20 return s1.c > s2.c; 21 } 22 23 bool cmpm(node s1, node s2) { 24 if(s1.m == s2.m) return s1.id < s2.id; 25 return s1.m > s2.m; 26 } 27 28 bool cmpe(node s1, node s2) { 29 if(s1.e == s2.e) return s1.id < s2.id; 30 return s1.e > s2.e; 31 } 32 33 int main() { 34 int n, m, id; 35 scanf("%d %d", &n, &m); 36 for(int i = 1; i <= n; i++) { 37 scanf("%d %d %d %d", &s[i].id, &s[i].c, &s[i].m, &s[i].e); 38 s[i].a = (s[i].c + s[i].m + s[i].e); 39 } 40 sort(s + 1, s + 1 + n, cmpa); 41 for(int i = 1; i <= n; i++) { 42 if(s[i].a == s[i-1].a) A[s[i].id] = A[ s[i - 1].id ]; 43 else A[s[i].id] = i; 44 } 45 sort(s + 1, s + 1 + n, cmpc); 46 for(int i = 1; i <= n; i++) { 47 if(s[i].c == s[i-1].c) C[s[i].id] = C[ s[i - 1].id ]; 48 else C[s[i].id] = i; 49 } 50 sort(s + 1, s + 1 + n, cmpm); 51 for(int i = 1; i <= n; i++) { 52 if(s[i].m == s[i-1].m) M[s[i].id] = M[ s[i - 1].id ]; 53 else M[s[i].id] = i; 54 } 55 sort(s + 1, s + 1 + n, cmpe); 56 for(int i = 1; i <= n; i++) { 57 if(s[i].e == s[i-1].e) E[s[i].id] = E[ s[i - 1].id ]; 58 else E[s[i].id] = i; 59 } 60 for(int i = 1; i <= m; i++) { 61 int level = INF; 62 char ans; 63 scanf("%d", &id); 64 if(A[id] != 0 && A[id] < level) level = A[id], ans = 'A'; 65 if(C[id] != 0 && C[id] < level) level = C[id], ans = 'C'; 66 if(M[id] != 0 && M[id] < level) level = M[id], ans = 'M'; 67 if(E[id] != 0 && E[id] < level) level = E[id], ans = 'E'; 68 if(level == INF) printf("N/A "); 69 else printf("%d %c ", level, ans); 70 } 71 return 0; 72 }
1013 Battle Over Cities
考虑某个顶点(k)被占领,那么我们需要把剩余的城市连接起来(这时候不考虑那些和顶点k连接的线),假设剩余的城市形成了m个集合(每个集合内的点都是连通的),我们需要m-1条边连接它们。
(代码中的cnt-2,是计算的时候把顶点k也单独看成一个集合,但是这个点不需要计算,所以再cnt-1的基础上再减去1)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 1234; 8 int fa[N], u[N * N], v[N * N]; 9 10 int fi(int x) { 11 return x == fa[x] ? x : fa[x] = fi(fa[x]); 12 } 13 14 void Union(int x, int y) { 15 int fx = fi(x), fy = fi(y); 16 if(fx != fy) { 17 fa[fx] = fy; 18 } 19 } 20 21 int main() { 22 int n, m, k, p; 23 scanf("%d %d %d", &n, &m, &k); 24 for(int i = 1; i <= m; i++) { 25 scanf("%d %d", &u[i], &v[i]); 26 } 27 for(int i = 1; i <= k; i++) { 28 int cnt = 0; 29 scanf("%d", &p); 30 for(int j = 1; j <= n; j++) fa[j] = j; 31 for(int j = 1; j <= m; j++) { 32 if(u[j] == p || v[j] == p) continue; 33 else Union(u[j], v[j]); 34 } 35 for(int j = 1; j <= n; j++) { 36 if(fa[j] == j) cnt++; 37 } 38 printf("%d ", cnt - 2); 39 } 40 return 0; 41 }
1014 Waiting in Line
队列模拟下。注意能够在17:00之前被服务到的,不管他需要办理业务多长时间,都是能够有答案的。
1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 1234; 9 queue<int> window[N]; 10 int ans1[N], ans2[N], t[N]; 11 12 int main() { 13 int n, m, k, q, time; 14 scanf("%d %d %d %d", &n, &m, &k, &q); 15 for(int i = 1; i <= k; i++) { 16 int pos = 1; 17 scanf("%d", &time); 18 for(int j = 1; j <= n; j++) { 19 if(i <= n * m) { 20 if(window[j].size() < window[pos].size()) pos = j; 21 } else { 22 if(window[j].front() < window[pos].front()) pos = j; 23 } 24 } 25 t[pos] += time; 26 window[pos].push(t[pos]); 27 if(i > n * m) window[pos].pop(); 28 if(t[pos] - time < 540) ans1[i] = 8 + t[pos] / 60, ans2[i] = t[pos] % 60; 29 else ans1[i] = -1; 30 } 31 for(int i = 1; i <= q; i++) { 32 int pos; 33 scanf("%d", &pos); 34 if(ans1[pos] == -1) printf("Sorry "); 35 else printf("%02d:%02d ", ans1[pos], ans2[pos]); 36 } 37 return 0; 38 }
1015 Reversible Primes
把原来的数转换成对应进制下的逆反数。再对原来的数和逆反数进行素数判断。比如23在2进制下为10111,逆反数为11101,再转换成10进制为29。
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 5 int Reverse(int n, int d) { 6 int res = 0; 7 while(n) { 8 res = res * d + n % d; 9 n /= d; 10 } 11 return res; 12 } 13 14 bool Check(int k) { 15 if(k <= 1) return false; 16 for(int i = 2; i * i <= k; i++) { 17 if(k % i == 0) return false; 18 } 19 return true; 20 } 21 22 int main() { 23 int n, d; 24 while(scanf("%d", &n) != EOF && n >= 0) { 25 scanf("%d", &d); 26 if(Check(n) && Check( Reverse(n, d) )) { 27 printf("Yes "); 28 } else { 29 printf("No "); 30 } 31 } 32 return 0; 33 }
1016 Phone Bills
注意题目中给的24小时的花费是 分/分钟。所有记录放进结构体中,按优先级大小 名字的字典序 > 时间排序,因为题目中时间的唯一性和时间都是按开始到结束排序的,那么前后分别为on和off的必然是合法数据。排序完后再映射到每个人去(参考了柳神的做法,感觉很巧妙),接着计算差值,按照要求输出。
1 #include <map> 2 #include <vector> 3 #include <cstdio> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 int cost[25]; 9 struct node{ 10 string name; 11 int time, month, day, hour, minute, stuate, status; 12 }rcd[1234]; 13 map<string, vector<node> > customer; 14 15 bool cmp(node x, node y) { 16 if(x.name == y.name) return x.time < y.time; 17 return x.name < y.name; 18 } 19 20 int main() { 21 int n; 22 for(int i = 0; i < 24; i++) scanf("%d", &cost[i]), cost[24] += cost[i]; 23 scanf("%d", &n); 24 for(int i = 1; i <= n; i++) { 25 string str; 26 cin >> rcd[i].name; 27 scanf("%d:%d:%d:%d", &rcd[i].month, &rcd[i].day, &rcd[i].hour, &rcd[i].minute); 28 cin >> str; 29 if(str == "on-line") rcd[i].status = 1; 30 else rcd[i].status = 0; 31 rcd[i].time = rcd[i].day * 24 * 60 + rcd[i].hour * 60 + rcd[i].minute; 32 } 33 sort(rcd + 1, rcd + 1 + n, cmp); 34 for(int i = 1; i <= n; i++) { 35 if(rcd[i - 1].name == rcd[i].name && rcd[i - 1].status == 1 && rcd[i].status == 0) { 36 customer[rcd[i].name].push_back(rcd[i - 1]); 37 customer[rcd[i].name].push_back(rcd[i]); 38 } 39 } 40 for(auto p : customer) { 41 double res = 0; 42 vector <node> date = p.second; 43 cout << p.first << " "; 44 printf("%02d ", date[0].month); 45 for(int i = 0; i < date.size(); i += 2) { 46 printf("%02d:%02d:%02d ", date[i].day, date[i].hour, date[i].minute); 47 printf("%02d:%02d:%02d ", date[i + 1].day, date[i + 1].hour, date[i + 1].minute); 48 double c1 = 0, c2 = 0; 49 for(int j = 0; j < 24; j++) { 50 if(j < date[i].hour) { 51 c1 += cost[j] * 60; 52 } else if(j == date[i].hour) { 53 c1 += date[i].day * cost[24] * 60 + 1.0 * date[i].minute * cost[j]; 54 } 55 } 56 for(int j = 0; j < 24; j++) { 57 if(j < date[i + 1].hour) { 58 c2 += cost[j] * 60; 59 } else if(j == date[i + 1].hour) { 60 c2 += date[i + 1].day * cost[24] * 60+ 1.0 * date[i + 1].minute * cost[j]; 61 } 62 } 63 printf("%d $%.2f ", date[i + 1].time - date[i].time, (c2 - c1) / 100); 64 res += (c2 - c1) / 100; 65 } 66 printf("Total amount: $%.2f ", res); 67 } 68 69 return 0; 70 }
1017 Queueing at Bank
直接模拟。每个窗口遍历一下,找到时间最前的窗口,维护下每个窗口的时间。这题和1014很像,但是有一个区别,1014题目中说的是17:00之前(包括17:00)服务得到就服务,这题是只要你17:00之前(包括17:00)到达银行,那你就能被服务,不用管你是不是在17:00后服务的。(这个就是最后一个点的trick)(还是要仔细看题呀)。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 1e4 + 10; 8 const int INF = 0x3f3f3f3f; 9 10 int t[N]; 11 struct node{ 12 int time, cost; 13 }p[N]; 14 15 bool cmp(node x, node y) { 16 return x.time < y.time; 17 } 18 19 int main(){ 20 int n, k, cnt = 0; 21 double ans = 0; 22 scanf("%d %d", &n, &k); 23 for(int i = 1; i <= n; i++) { 24 int hh, mm, ss; 25 scanf("%d:%d:%d %d", &hh, &mm, &ss, &p[i].cost); 26 p[i].time = 3600 * hh + 60 * mm + ss; 27 p[i].cost *= 60; 28 } 29 sort(p + 1, p + 1 + n, cmp); 30 for(int i = 1; i <= k; i++) t[i] = 8 * 3600; 31 for(int i = 1; i <= n; i++) { 32 if(p[i].time > 17 * 3600) break; 33 int pos = 1; 34 for(int j = 1; j <= k; j++) { 35 if(t[pos] > t[j]) pos = j; 36 } 37 if(p[i].time > t[pos]) { 38 t[pos] = p[i].time; 39 } else { 40 ans += 1.0 * (t[pos] - p[i].time); 41 } 42 t[pos] += p[i].cost; 43 cnt++; 44 } 45 printf("%.1f ", ans/60.0/cnt); 46 return 0; 47 }
1018 Public Bike Management
一开始我用dijkstra,一直有几个点过不去。去看了下网上的题解,发现这题数据不大可以直接用暴力DFS+剪枝过。到达终点,判断的条件需要满足最短路条件,先满足从0点拿出最少,然后满足送回0点最少。
判断顺序需要注意。还有就是DFS的时候需要回溯,标记打完记得消除。
1 #include <vector> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int maxn = 555; 9 const int INF = 0x3f3f3f3f; 10 bool vis[maxn]; 11 int c[maxn], d[maxn]; 12 int Cmax, N, Sp, M; 13 ///take 拿去;bring 带回 14 int sum = 0, take = 0, bring = 0; 15 int ans_sum = INF, ans_take = INF, ans_bring = INF; 16 vector<int> path; 17 vector<int> ans_path; 18 vector< pair<int,int> > E[maxn]; 19 20 void dfs(int u) { 21 if(ans_sum < sum ) return ; 22 if(u == Sp) { 23 if(ans_sum > sum) { 24 ans_sum = sum; 25 ans_bring = bring; 26 ans_take = take; 27 ans_path = path; 28 } else { 29 if(ans_take > take || (ans_take == take && (ans_bring > bring) )) { 30 ans_bring = bring; 31 ans_take = take; 32 ans_path = path; 33 } 34 } 35 return ; 36 } 37 for(int i = 0; i < E[u].size(); i++) { 38 int v = E[u][i].first; 39 int dis = E[u][i].second; 40 int tmp_sum = sum, tmp_bring = bring, tmp_take = take; 41 if(!vis[v] && d[v] >= d[u] + dis) { 42 vis[v] = 1; 43 sum += dis; 44 bring += (c[v] - Cmax / 2); 45 if(bring < 0) take -= bring, bring = 0; 46 path.push_back(v); 47 d[v] = d[u] + dis; 48 dfs(v); 49 vis[v] = 0; 50 sum = tmp_sum; 51 bring = tmp_bring; 52 take = tmp_take; 53 path.pop_back(); 54 } 55 } 56 57 } 58 59 int main(){ 60 scanf("%d%d%d%d", &Cmax, &N, &Sp, &M); 61 for(int i = 1; i <= N; i++) { 62 scanf("%d", &c[i]); 63 } 64 for(int i = 1; i <= M; i++) { 65 int u, v, w; 66 scanf("%d %d %d", &u, &v, &w); 67 E[u].push_back(make_pair(v, w)); 68 E[v].push_back(make_pair(u, w)); 69 } 70 for(int i = 0; i< maxn; i++) d[i] = INF; 71 d[0] = 0; vis[0] = 1; 72 dfs(0); 73 printf("%d 0", ans_take); 74 for(int i = 0; i < ans_path.size(); i++) { 75 printf("->%d", ans_path[i]); 76 } 77 printf(" %d",ans_bring); 78 return 0; 79 }
1019 General Palindromic Number
把n转换成b进制下的数,判断下该数是否回文。
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int a[50]; 6 7 int main() { 8 bool f = 1; 9 int n, m, cnt = 0; 10 cin >> n >> m; 11 while(n) { 12 a[++cnt] = n % m; 13 n /= m; 14 } 15 for(int i = 1; i <= cnt / 2; i++) { 16 if(a[i] != a[cnt - i + 1]) { 17 f = 0; 18 break; 19 } 20 } 21 if(f) printf("Yes "); 22 else printf("No "); 23 for(int i = cnt; i >= 1; i--) { 24 printf("%d", a[i]); 25 if(i != 1) printf(" "); 26 } 27 return 0; 28 }
1020 Tree Traversals
前序遍历:根左右;中序遍历:左根右;后序遍历:左右根。
该题知道中序遍历和后序遍历,求层序遍历。 由后序遍历我们可以知道根节点。根据得到的根节点,去中序遍历中找到对应位置,该位置左边的就为左子树的顶点,右边的为右子树的顶点,根据长度我们可以同时在后序遍历中找到对应段。一直搜索下去,直到叶子节点,没有子树的设置-1。
1 #include <queue> 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 1e7 + 10; 8 int post[33], in[33]; 9 int node[N]; 10 11 // l1 r1 后序; l2 r2 中序 12 void restore(int l1, int r1, int l2, int r2, int id) { 13 if(l1 > r1) { 14 node[id] = -1; 15 return ; 16 } 17 node[id] = post[r1]; 18 for(int i = l2; i <= r2; i++) { 19 if(in[i] == node[id]) { 20 int len = i - l2; 21 restore(l1, l1 + len -1, l2, i - 1, 2 * id); 22 restore(l1 + len, r1 - 1, i + 1, r2, 2 * id + 1); 23 } 24 } 25 } 26 27 int main() { 28 int n; 29 cin >> n; 30 for(int i = 1; i <= n; i++) cin >> post[i]; 31 for(int i = 1; i <= n; i++) cin >> in[i]; 32 restore(1, n, 1, n, 1); 33 queue <int> Q; 34 Q.push(1); 35 while(!Q.empty()) { 36 int u = Q.front(); 37 Q.pop(); 38 if(node[2 * u] != -1) Q.push(2 * u); 39 if(node[2 * u + 1] != -1) Q.push(2 * u + 1); 40 if(u != 1) cout << " "; 41 if(node[u] != -1) cout << node[u]; 42 } 43 return 0; 44 }
1021 Deepest Root
先并查集判断下是不是树。DFS暴力跑每个顶点,求每个顶点能跑最远的距离。本来以为还要剪枝,做下标记什么的,没想到暴力一跑,A了。(数据可能比较水,暴力的时间复杂度达到O(n^2))
1 #include <vector> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 1e4 + 10; 9 int fa[N], d[N]; 10 vector <int> E[N]; 11 12 int fi(int x) { 13 return x == fa[x] ? fa[x] : fa[x] = fi(fa[x]); 14 } 15 16 void Union(int x, int y) { 17 int fx = fi(x), fy = fi(y); 18 if(fx != fy) { 19 fa[fx] = fy; 20 } 21 } 22 23 void dfs(int st, int u, int F, int deep) { 24 d[st] = max(d[st], deep); 25 for(int i = 0; i < E[u].size(); i++) { 26 int v = E[u][i]; 27 if(v != F) dfs(st, v, u, deep + 1); 28 } 29 } 30 31 int main() { 32 int n, cnt = 0; 33 scanf("%d", &n); 34 for(int i = 1; i <= n; i++) fa[i] = i; 35 for(int i = 1; i < n; i++){ 36 int u, v; 37 scanf("%d %d", &u, &v); 38 E[u].push_back(v); 39 E[v].push_back(u); 40 Union(u, v); 41 } 42 for(int i = 1; i <= n; i++) { 43 if(i == fa[i]) cnt++; 44 } 45 if(cnt > 1) { 46 printf("Error: %d components", cnt); 47 } else { 48 int mx = 0; 49 for(int i = 1;i <= n; i++) { 50 dfs(i, i, -1, 1); 51 mx = max(mx, d[i]); 52 } 53 for(int i = 1; i <= n; i++) { 54 if(d[i] == mx) printf("%d ", i); 55 } 56 } 57 58 return 0; 59 }
1022 Digital Library
这题就用map搞下就好了。本来想用hash,搞了一个多小时,一直过不了,就放弃了。注意输出ID的时候用%7d,一直没注意,卡了挺久的。
1 #include <set> 2 #include <map> 3 #include <cstdio> 4 #include <iostream> 5 using namespace std; 6 7 8 string s; 9 map <string, set<int> > mp[10]; 10 11 int main() { 12 int n, m, id, pos; 13 cin >> n; 14 for(int i = 1; i <= n; i++) { 15 cin >> id; 16 getchar(); 17 for(int j = 1; j <= 5; j++) { 18 if(j == 3) { 19 while(cin >> s) { 20 mp[j][s].insert(id); 21 char c = getchar(); 22 if(c == ' ') break; 23 } 24 continue; 25 } 26 getline(cin, s); 27 mp[j][s].insert(id); 28 } 29 } 30 cin >> m; 31 for(int i = 1; i <= m; i++) { 32 char c; 33 cin >> pos >> c; 34 getchar(); 35 getline(cin, s); 36 cout << pos << ": " << s << endl; 37 if(mp[pos].find(s) != mp[pos].end()) { 38 for(auto it : mp[pos][s]) printf("%07d ", it); 39 } else { 40 printf("Not Found "); 41 } 42 } 43 return 0; 44 }
1023 Have Fun with Numbers
把2倍的计算出来与原来的比较一下。字符串存,no的时候也要输出字符串。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 char s1[25], s2[25], ans[25]; 8 9 int main() { 10 int val, cnt = 0; 11 scanf("%s", s1 + 1); 12 int len = strlen(s1 + 1); 13 for(int i = len; i >= 1; i--) { 14 val = 2 * (s1[i] - '0') + cnt; 15 cnt = 0; 16 if(val >= 10) val -= 10, cnt++; 17 s2[i] = (val + '0'); ans[i] = s2[i]; 18 } 19 sort(s1 + 1, s1 + 1 + len); 20 sort(s2 + 1, s2 + 1 + len); 21 for(int i = 1; i <= len; i++) { 22 if(s1[i] != s2[i]) { 23 printf("No "); 24 if(cnt > 0) printf("1%s", ans + 1); 25 else printf("%s", ans + 1); 26 return 0; 27 } 28 } 29 printf("Yes "); 30 printf("%s", ans + 1); 31 return 0; 32 }
1024 Palindromic Number
考虑下最大能变成多少,每次加上翻转后的数,看成每次乘上2,那么最大的数会变成$10^10 * 2^100$。long long会爆,用string存。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long ll; 8 9 bool check(string n) { 10 for(int i = 0, j = n.size() - 1; i < j; i++, j--) { 11 if(n[i] != n[j]) return false; 12 } 13 return true; 14 } 15 16 string cal(string n) { 17 string m = n, res = ""; 18 reverse(n.begin(), n.end()); 19 int cnt = 0; 20 for(int i = m.size() - 1; i >= 0; i--) { 21 int d = (m[i] - '0') + (n[i] - '0') + cnt; 22 cnt = 0; 23 if(d >= 10) d -= 10, cnt++; 24 char c = d + '0'; 25 res = c + res; 26 } 27 if(cnt > 0) res = "1" + res; 28 return res; 29 } 30 31 int main() { 32 int k; 33 string n; 34 cin >> n >> k; 35 for(int i = 1; i <= k; i++) { 36 if(check(n)) { 37 cout << n << endl << i - 1 << endl; 38 return 0; 39 } 40 n = cal(n); 41 } 42 cout << n << endl << k << endl; 43 return 0; 44 }
1025 PAT Ranking
结构体排序。部分先排,再全部排序。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long ll; 8 const int N = 30000 +10; 9 struct node { 10 ll id; 11 int grade, fin, loc_num, loc_rank; 12 }p[N]; 13 14 bool cmp(node x, node y) { 15 if(x.grade == y.grade) return x.id < y.id; 16 return x.grade > y.grade; 17 } 18 19 int main() { 20 int n, m, cnt = 0; 21 scanf("%d", &n); 22 for(int i = 1; i <= n; i++) { 23 scanf("%d", &m); 24 for(int j = 0; j < m; j++) { 25 scanf("%lld %d", &p[cnt + j].id, &p[cnt + j].grade); 26 p[cnt + j].loc_num = i; 27 } 28 sort(p + cnt, p + cnt + m, cmp); 29 p[cnt].loc_rank = 1; 30 for(int j = 1; j < m; j++) { 31 if(p[cnt + j].grade == p[cnt + j - 1].grade) { 32 p[cnt + j].loc_rank = p[cnt + j - 1].loc_rank; 33 } else { 34 p[cnt + j].loc_rank = j + 1; 35 } 36 } 37 cnt += m; 38 } 39 sort(p, p + cnt, cmp); 40 printf("%d ", cnt); 41 for(int i = 0; i < cnt; i++) { 42 if(i == 0 || p[i].grade != p[i - 1].grade) { 43 p[i].fin = i + 1; 44 } else { 45 p[i].fin = p[i - 1].fin; 46 } 47 printf("%013lld %d %d %d ", p[i].id, p[i].fin, p[i].loc_num, p[i].loc_rank); 48 } 49 return 0; 50 }
1027 Colors in Mars
进制转换
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 int c[4]; 8 9 void solve(int v) { 10 char c1, c2; 11 int a1 = v / 13, a2 = v % 13; 12 if(a1 > 9) c1 = 'A' + (a1 - 10); 13 else c1 = '0' + a1; 14 if(a2 > 9) c2 = 'A' + (a2 - 10); 15 else c2 = '0' + a2; 16 cout << c1 << c2; 17 } 18 19 int main() { 20 for(int i = 1; i <= 3; i++) cin >> c[i]; 21 cout << "#"; 22 for(int i = 1; i <= 3; i++) solve(c[i]); 23 return 0; 24 }
1028 List Sorting
结构体排序,strcmp函数。(这个函数都快忘记了,-_-||)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 1e5 + 10; 8 struct node { 9 int id, grade; 10 char name[10]; 11 }p[N]; 12 13 bool cmp1(node x, node y) { 14 return x.id < y.id; 15 } 16 17 bool cmp2(node x, node y) { 18 if( strcmp(x.name, y.name) == 0) { 19 return x.id < y.id; 20 } 21 return strcmp(x.name, y.name) < 0; 22 } 23 24 bool cmp3(node x, node y) { 25 if(x.grade == y.grade) { 26 return x.id < y.id; 27 } 28 return x.grade < y.grade; 29 } 30 31 int main() { 32 int n, k; 33 scanf("%d %d", &n, &k); 34 for(int i = 1; i <= n; i++) { 35 scanf("%d %s %d", &p[i].id, &p[i].name, &p[i].grade); 36 } 37 if(k == 1) { 38 sort(p + 1, p + 1 + n, cmp1); 39 } 40 else if(k == 2){ 41 sort(p + 1, p + 1 + n, cmp2); 42 } else { 43 sort(p + 1, p + 1 + n, cmp3); 44 } 45 for(int i = 1; i <= n; i++) { 46 printf("%06d %s %d ", p[i].id, p[i].name, p[i].grade); 47 } 48 return 0; 49 }
1029 Median
最后一组卡内存。确定位置$(n+m+1)/2$,输入m个数字的同时,通过与之前输入的n个数字比较,用一个下标不断逼近位置。
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 const int N = 2e5 + 5; 7 int a[N]; 8 9 int main() { 10 int n, m, num; 11 scanf("%d", &n); 12 for(int i = 1; i <= n; i++) scanf("%d", &a[i]); 13 scanf("%d", &m); 14 int id = 1, cnt = 0; 15 int mid = (n + m + 1) / 2; 16 for(int i = 1; i <= m; i++) { 17 scanf("%d", &num); 18 while(id <= n && num > a[id]) { 19 cnt++; 20 if(cnt == mid) {printf("%d", a[id]); return 0;} 21 id++; 22 } 23 cnt++; 24 if(cnt == mid) {printf("%d", num); return 0;} 25 } 26 while(cnt < mid && id < n) { 27 cnt++; 28 if(cnt == mid) {printf("%d", a[id]); return 0;} 29 id++; 30 } 31 return 0; 32 }
1030 Travel Plan
最短路套路题+遍历路径。
1 #include <queue> 2 #include <vector> 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 const int N = 500 + 10; 10 bool vis[N]; 11 int sum[N], d[N], pre[N]; 12 int n, m, c1, c2; 13 14 struct edge{ 15 int u, v, dis, cost; 16 }; 17 18 struct node{ 19 int u, dis; 20 friend bool operator < (node a, node b) { 21 return a.dis > b.dis; 22 } 23 }; 24 25 vector<edge> E[N]; 26 27 void dijkstra() { 28 priority_queue<node> Q; 29 Q.push(node{c1, 0}); 30 memset(d, 0x3f, sizeof(d)); 31 d[c1] = 0; 32 while(!Q.empty()) { 33 int u = Q.top().u; 34 Q.pop(); 35 if(vis[u]) continue; 36 vis[u] = 1; 37 for(int i = 0; i < E[u].size(); i++) { 38 int v = E[u][i].v, w = E[u][i].dis, c = E[u][i].cost; 39 if(d[v] > d[u] + w) { 40 d[v] = d[u] + w; 41 sum[v] = sum[u] + c; 42 Q.push(node{v, d[v]}); 43 pre[v] = u; 44 } 45 else if(d[v] == d[u] + w) { 46 if(sum[u] + c < sum[v]) { 47 sum[v] = sum[u] + c; 48 Q.push(node{v, d[v]}); 49 pre[v] = u; 50 } 51 } 52 } 53 } 54 55 } 56 57 void print(int u){ 58 if(u != -1){ 59 print(pre[u]); 60 printf("%d ", u); 61 } 62 } 63 64 int main() { 65 scanf("%d %d %d %d", &n, &m, &c1, &c2); 66 for(int i = 1; i <= m; i++) { 67 int u, v, w, c; 68 scanf("%d %d %d %d", &u, &v, &w, &c); 69 E[u].push_back(edge{u, v, w, c}); 70 E[v].push_back(edge{v, u, w, c}); 71 } 72 dijkstra(); 73 pre[c1] = -1; 74 print(c2); 75 printf("%d %d", d[c2], sum[c2]); 76 return 0; 77 }
1031 Hello World for U
模拟暴力输出。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 char s[85]; 8 9 int main() { 10 scanf("%s", s); 11 int n = strlen(s), n1 = (n + 2) / 3, n2 = n - 2 * n1; 12 for(int i = 0; i < n1 - 1; i++) { 13 printf("%c", s[i]); 14 for(int j = 1; j <= n2; j++) printf(" "); 15 printf("%c ", s[n - i - 1]); 16 } 17 for(int i = n1 - 1; i <= n1 + n2; i++) { 18 printf("%c",s[i]); 19 } 20 return 0; 21 }
1032 Sharing
记录下位置往后跑。重复经过的第一个位置为答案。
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 const int N = 1e5 + 10; 7 int nxt[N], vis[N]; 8 9 int main() { 10 int s1, s2, n; 11 scanf("%d %d %d", &s1, &s2, &n); 12 for(int i = 1; i <= n; i++) { 13 int Now, Nxt; 14 char c; 15 scanf("%d %c %d", &Now, &c, &Nxt); 16 nxt[Now] = Nxt; 17 } 18 while(s1 != -1) { 19 vis[s1]++; 20 s1 = nxt[s1]; 21 } 22 while(s2 != -1) { 23 if(vis[s2]) { 24 printf("%05d ", s2); 25 return 0; 26 } 27 vis[s2]++; 28 s2 = nxt[s2]; 29 } 30 printf("-1 "); 31 return 0; 32 }
1033 To Fill or Not to Fill
贪心策略:优先前往油价低的站,若比当前油价低,直接跑到这个站;否则前往这些站中油价最低的站。更新当前位置和油桶中的油量和最后的答案。
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 const int N = 555; 7 const double INF = 1e18; 8 struct node { 9 double dis, price; 10 }sta[N]; 11 12 bool cmp(node x, node y) { 13 return x.dis < y.dis; 14 } 15 16 int main() { 17 int now_pos = 0, n; 18 double c_max, d, d_avg, ans = 0, now_tank = 0; 19 scanf("%lf %lf %lf %d", &c_max, &d, &d_avg, &n); 20 for(int i = 0; i < n; i++) { 21 scanf("%lf %lf", &sta[i].price, &sta[i].dis); 22 } 23 sta[n].price = 0; sta[n].dis = d; 24 sort(sta, sta + 1 + n, cmp); 25 if(sta[0].dis != 0) { 26 printf("The maximum travel distance = 0.00 "); 27 return 0; 28 } 29 while(now_pos < n) { 30 int nxt_pos = -1; 31 double min_price = INF; 32 for(int i = now_pos + 1; i <= n && (sta[i].dis - sta[now_pos].dis) <= c_max * d_avg; i++) { 33 if(min_price > sta[i].price) { 34 min_price = sta[i].price; 35 nxt_pos = i; 36 if(min_price < sta[now_pos].price) { 37 break; 38 } 39 } 40 } 41 if(nxt_pos == -1) break; 42 double need = (sta[nxt_pos].dis - sta[now_pos].dis) / d_avg; 43 if(min_price < sta[now_pos].price) { 44 if(now_tank >= need) { 45 now_tank -= need; 46 } else { 47 ans += (need - now_tank) * sta[now_pos].price; 48 now_tank = 0; 49 } 50 } else { 51 ans += (c_max - now_tank) * sta[now_pos].price; 52 now_tank = c_max - need; 53 } 54 now_pos = nxt_pos; 55 } 56 if(now_pos == n) { 57 printf("%.2f ", ans); 58 } else { 59 printf("The maximum travel distance = %.2f ", sta[now_pos].dis + c_max * d_avg); 60 } 61 return 0; 62 }
1034 Head of a Gang
并查集扔扔,map标记来标记过去,最后存起来排个序。
1 //1034 Head of a Gang 2 #include <map> 3 #include <cstdio> 4 #include <vector> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 struct node{ 10 string name; 11 int cnt; 12 }; 13 14 bool cmp(node x, node y) { 15 return x.name < y.name; 16 } 17 18 const int N = 2010; 19 vector <string> v[N]; 20 vector <node> ans; 21 map<string, int> m; 22 map<int, string> rm; 23 int fa[N], t[N]; 24 25 int fi(int x) { 26 return fa[x] == x ? x : fa[x] = fi(fa[x]); 27 } 28 29 int main() { 30 for(int i = 1; i < N; i++) fa[i] = i; 31 int cnt = 0; 32 int n, k, time; 33 string name1, name2, name; 34 cin >> n >> k; 35 for(int i = 1; i <= n; i++) { 36 cin >> name1 >> name2 >> time; 37 if(!m[name1]) m[name1] = ++cnt, rm[cnt] = name1; 38 if(!m[name2]) m[name2] = ++cnt, rm[cnt] = name2; 39 t[m[name1]] += time; 40 t[m[name2]] += time; 41 int fx = fi(m[name1]), fy = fi(m[name2]); 42 if(fx != fy) { 43 fa[fx] = fy; 44 } 45 } 46 for(int i = 1; i <= n; i++) { 47 int id = fi(i); 48 v[id].push_back(rm[i]); 49 } 50 for(int i = 1; i <= n; i++) { 51 if(v[i].size() > 2) { 52 int sum = 0, mx = 0; 53 for(int j = 0; j < v[i].size(); j++) { 54 sum += t[m[v[i][j]]]; 55 if(mx < t[m[v[i][j]]]) { 56 mx = t[m[v[i][j]]]; 57 name = v[i][j]; 58 } 59 } 60 node tmp; tmp.cnt = v[i].size(); tmp.name = name; 61 if(sum > 2 * k) ans.push_back(tmp); 62 } 63 } 64 sort(ans.begin(), ans.end(), cmp); 65 cout << ans.size() << endl; 66 for(int i = 0; i < ans.size(); i++) { 67 cout << ans[i].name << " " << ans[i].cnt << endl; 68 } 69 return 0; 70 }
1035 Password
注意输出格式。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 1005; 8 bool vis[N]; 9 char s1[N][15], s2[N][15]; 10 11 int main() { 12 int n, m, cnt = 0; 13 scanf("%d", &n); 14 for(int i = 0; i < n; i++) { 15 scanf("%s %s", s1[i], s2[i]); 16 m = strlen(s2[i]); 17 for(int j = 0; j < m; j++) { 18 if(s2[i][j] == '1') s2[i][j] = '@', vis[i] = 1; 19 if(s2[i][j] == '0') s2[i][j] = '%', vis[i] = 1; 20 if(s2[i][j] == 'l') s2[i][j] = 'L', vis[i] = 1; 21 if(s2[i][j] == 'O') s2[i][j] = 'o', vis[i] = 1; 22 } 23 if(vis[i]) cnt++; 24 } 25 if(!cnt) { 26 if(n == 1) printf("There is %d account and no account is modified ", n); 27 else printf("There are %d accounts and no account is modified ", n); 28 } else { 29 printf("%d ", cnt); 30 for(int i = 0; i < n; i++) { 31 if(vis[i]) printf("%s %s ", s1[i], s2[i]); 32 } 33 } 34 return 0; 35 }
1036 Boys vs Girls
模拟即可。
1 #include <cstdio> 2 #include <vector> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 struct node{ 8 string name, gender, ID; 9 int grade; 10 }ans; 11 12 bool cmp(node x, node y) { 13 return x.grade < y.grade; 14 } 15 16 vector <node> M, F; 17 18 int main() { 19 int n, grade; 20 string name, gender, ID; 21 cin >> n; 22 for(int i = 1; i <= n; i++) { 23 cin >> name >> gender >> ID >> grade; 24 if(gender == "M") M.push_back(node{name, gender, ID, grade}); 25 else F.push_back(node{name, gender, ID, grade}); 26 } 27 sort(M.begin(), M.end(), cmp); 28 sort(F.begin(), F.end(), cmp); 29 if(!M.size() || !F.size()) { 30 if(F.size()) { 31 ans = F[F.size() - 1]; 32 cout << ans.name << " " << ans.ID << endl; 33 } else { 34 cout << "Absent" << endl; 35 } 36 if(M.size()) { 37 ans = M[0]; 38 cout << ans.name << " " << ans.ID << endl; 39 } else { 40 cout << "Absent" << endl; 41 } 42 cout << "NA" << endl; 43 } else { 44 ans = F[F.size() - 1]; 45 grade = ans.grade; 46 cout << ans.name << " " << ans.ID << endl; 47 ans = M[0]; 48 cout << ans.name << " " << ans.ID << endl; 49 grade -= ans.grade; 50 cout << grade << endl; 51 } 52 return 0; 53 }
1037 Magic Coupon
先排序,接着前面负的搞一次,后面正的搞一次。
1 //1037 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 int n, m; 8 const int N = 1e5 + 10; 9 typedef long long ll; 10 ll a[N], b[N]; 11 12 int main() { 13 ll ans = 0; 14 scanf("%d", &n); 15 for(int i = 1; i <= n; i++) scanf("%lld", &a[i]); 16 scanf("%d", &m); 17 for(int i = 1; i <= m; i++) scanf("%lld", &b[i]); 18 sort(a + 1, a + 1 + n); 19 sort(b + 1, b + 1 + m); 20 for(int i = 1, j = 1; i <= n && j <= m && b[j] < 0 && a[i] < 0; i++, j++) { 21 ans += a[i] * b[j]; 22 } 23 for(int i = n, j = m; i >= 1 && j >= 1 && b[j] > 0 && a[i] > 0; i--, j--) { 24 ans += a[i] * b[j]; 25 } 26 printf("%lld ", ans); 27 return 0; 28 }
1038 Recover the Smallest Number
使得数字最小,字符串排序的时候可以这样考虑,判断是s1 s2 小还是 s2 s1小即可。
1 //1038 2 #include <vector> 3 #include <cstdio> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 vector <string> v; 9 10 bool cmp(string s1, string s2) { 11 return s1 + s2 < s2 + s1; 12 } 13 14 int main() { 15 int n; 16 bool vis = 0; 17 string s; 18 cin >> n; 19 for(int i = 0; i < n; i++) { 20 cin >> s; 21 v.push_back(s); 22 } 23 sort(v.begin(), v.end(), cmp); 24 s = ""; 25 for(int i = 0; i < n; i++) s = s + v[i]; 26 for(int i = 0; i < s.size(); i++) { 27 if(s[i] == '0' && !vis) continue; 28 else { 29 vis = 1; 30 cout << s[i]; 31 } 32 } 33 if(!vis) cout << 0; 34 return 0; 35 }
1039 Course List for Student
map标记位置,按坑填就即可。题目中的N应该是400000吧(汗...)
1 #include <map> 2 #include <vector> 3 #include <cstdio> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 char s[10]; 9 map <int, int> m; 10 const int N = 400000 + 10; 11 vector <int> v[N]; 12 13 int cal() { 14 int res = (s[3] - '0'); 15 res += (s[2] - 'A') * 10; 16 res += (s[1] - 'A') * 26 * 10; 17 res += (s[0] - 'A') * 26 * 26 * 10; 18 return res; 19 } 20 21 int main() { 22 int n, k, a, b, name, cnt = 1; 23 scanf("%d%d", &n, &k); 24 for(int i = 1; i <= k; i++) { 25 scanf("%d%d", &a, &b); 26 for(int j = 1; j <= b; j++) { 27 scanf("%s", s); 28 name = cal() + 1; 29 if(!m[name]) m[name] = cnt++; 30 v[m[name]].push_back(a); 31 } 32 } 33 for(int i = 1 ; i <= cnt; i++) sort(v[i].begin(), v[i].end()); 34 for(int i = 1; i <= n; i++) { 35 scanf("%s", s); 36 name = cal() + 1; 37 int id = m[name]; 38 printf("%s %d", s, v[id].size()); 39 for(int j = 0; j < v[id].size(); j++) { 40 printf(" %d", v[id][j]); 41 } 42 printf(" "); 43 } 44 return 0; 45 }
1040 Longest Symmetric String
从两个扩展和从一个扩展分别跑一次,更新答案。
1 //1040 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 1234; 8 char s[N]; 9 10 int main() { 11 int n = 0, ans = 1; 12 char c; 13 while(scanf("%c", &c) != EOF && c != ' ') { 14 s[n++] = c; 15 } 16 for(int k = 0; k < n; k++) { 17 int tmp = 1; 18 for(int i = 1; (k - i) >= 0 && (k + i) < n; i++) { 19 if(s[k - i] == s[k + i]) tmp += 2; 20 else break; 21 } 22 ans = max(ans, tmp); 23 } 24 for(int k = 0; k < n; k++) { 25 int tmp = 0; 26 if(s[k] == s[k + 1]) { 27 for(int i = 0; (k - i) >= 0 && (k + 1 + i) < n; i++) { 28 if(s[k - i] == s[k + 1 + i]) tmp += 2; 29 else break; 30 } 31 } 32 ans = max(ans, tmp); 33 } 34 printf("%d ", ans); 35 return 0; 36 }
1041 Be Unique
map一下,输出计数为1的即可。否则输出None
1 #include <map> 2 #include <iostream> 3 using namespace std; 4 5 const int N = 1e5 + 10; 6 int a[N]; 7 map<int, int> m; 8 9 int main() { 10 int n; 11 cin >> n; 12 for(int i = 1; i <= n; i++) { 13 cin >> a[i]; 14 m[a[i]]++; 15 } 16 for(int i = 1; i <= n; i++) { 17 if(m[a[i]] == 1) { 18 cout << a[i] << endl; 19 return 0; 20 } 21 } 22 cout << "None" << endl; 23 return 0; 24 }
1042 Shuffling Machine
存放前后结果,模拟过去即可。
1 #include <cstdio> 2 using namespace std; 3 4 char s[5] = {'S','H','C','D','J'}; 5 6 int A[60], B[60], in[60]; 7 8 int main() { 9 int n; 10 scanf("%d", &n); 11 for(int i = 1; i <= 54; i++) A[i] = i; 12 for(int i = 1; i <= 54; i++) scanf("%d", &in[i]); 13 for(int i = 0; i < n; i++) { 14 for(int j = 1; j <= 54; j++) B[in[j]] = A[j]; 15 for(int j = 1; j <= 54; j++) A[j] = B[j]; 16 } 17 for(int i = 1; i <= 54; i++) { 18 if(i > 1) printf(" "); 19 printf("%c%d", s[(B[i]-1)/13], (B[i]-1)%13+1); 20 } 21 return 0; 22 }
1043 Is It a Binary Search Tree
(学习一波柳神的写法。)由前序遍历找到左右孩子的边界。注意边界的调整,因为后序遍历是左右根,我们DFS的时候先往左搜索,搜完后把答案存下来。
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 const int N = 1234; 7 bool f = 0; 8 int pre[N], post[N], cnt = 0; 9 10 void dfs(int root, int tail) { 11 if(root > tail) return ; 12 int l = root + 1, r = tail; 13 if(!f) { 14 while(l <= tail && pre[l] < pre[root]) l++; 15 while(r >= root && pre[r] >= pre[root]) r--; 16 } else { 17 while(l <= tail && pre[l] >= pre[root]) l++; 18 while(r >= root && pre[r] < pre[root]) r--; 19 } 20 dfs(root + 1, r); 21 dfs(l, tail); 22 post[++cnt] = pre[root]; 23 } 24 25 int main() { 26 int n; 27 cin >> n; 28 for(int i = 1; i <= n; i++) cin >> pre[i]; 29 dfs(1, n); 30 if(cnt != n) { 31 cnt = 0; 32 f = 1; 33 dfs(1, n); 34 } 35 if(cnt == n) { 36 cout << "YES" << endl; 37 for(int i = 1; i <= n; i++) { 38 if(i == 1) cout << post[i]; 39 else cout << " " << post[i]; 40 } 41 } else { 42 cout << "NO" << endl; 43 } 44 return 0; 45 }
1044 Shopping in Mars
先前缀和,然后两次二分,第一次找>=m最小的。第二次二分把符合的扔进去。
1 //1044 Shopping in Mars 2 #include <vector> 3 #include <cstdio> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int INF = 0x3f3f3f3f; 9 const int N = 1e5 + 10; 10 int a[N]; 11 vector< pair<int, int> > v; 12 13 int main() { 14 int n, m; 15 int mi = INF; 16 scanf("%d %d", &n, &m); 17 for(int i = 0; i < n; i++) { 18 scanf("%d", &a[i]); 19 if(i != 0) a[i] += a[i - 1]; 20 } 21 for(int i = 0; i < n; i++) { 22 int val = 0; 23 if(i != 0) val = a[i - 1]; 24 int pos = lower_bound(a + i, a + n, val + m) - a; 25 if((a[pos] -val) >= m) { 26 mi = min(mi, (a[pos] - val)); 27 } 28 } 29 for(int i = 0; i < n; i++) { 30 int val = 0; 31 if(i != 0) val = a[i - 1]; 32 int pos = lower_bound(a + i, a + n, val + mi) - a; 33 if((a[pos] -val) == mi) { 34 v.push_back(make_pair(i + 1, pos + 1)); 35 } 36 } 37 for(int i = 0; i < v.size(); i++) { 38 printf("%d-%d ", v[i].first, v[i].second); 39 } 40 return 0; 41 }
1045 Favorite Color Stripe
连dp渣渣的我都会写。从后往前,先找出该点位置在a数组中对应的颜色,然后从后面的颜色转移过来。
$dp[b[i]] = max( dp[b[i]], dp[a[j]] + 1)$
1 //1045 Favorite Color Stripe 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 210; 8 const int L = 10010; 9 int a[N], dp[N], b[L]; 10 11 int main() { 12 int n, m, l, ans = 0; 13 cin >> n >> m; 14 for(int i = 1; i <= m; i++) cin >> a[i]; 15 cin >> l; 16 for(int i = 1; i <= l; i++) cin >> b[i]; 17 for(int i = l; i >= 1; i--) { 18 bool f = 0; 19 for(int j = 1; j <= m; j++) { 20 if(b[i] == a[j]) f = 1; 21 if(f) { 22 dp[b[i]] = max(dp[b[i]] ,dp[a[j]] + 1); 23 ans = max(ans, dp[b[i]]); 24 } 25 } 26 } 27 cout << ans << endl; 28 return 0; 29 }
1046 Shortest Distance
小学数学题。前缀和下,再分别顺时针和逆时针比较下。
1 //1046 Shortest Distance 2 #include <vector> 3 #include <cstdio> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 1e5 + 10; 9 int a[N]; 10 11 int main() { 12 int n, m; 13 cin >> n; 14 for(int i = 1; i <= n; i++) { 15 cin >> a[i]; 16 a[i] += a[i - 1]; 17 } 18 cin >> m; 19 for(int i = 1; i <= m; i++) { 20 int l, r; 21 cin >> l >> r; 22 if(l > r) swap(l, r); 23 int ans1 = a[r - 1] - a[l - 1]; 24 int ans2 = (a[n] - a[r - 1]) + a[l - 1]; 25 cout << min(ans1, ans2) << endl; 26 } 27 return 0; 28 }
1047 Student List for Course
对应存就好了。
1 //1047 Student List for Course 2 #include <vector> 3 #include <cstring> 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 const int N = 2505; 10 char s[20 * N][5]; 11 vector <int> v[N]; 12 13 bool cmp(int a, int b) { 14 return strcmp(s[a], s[b]) < 0; 15 } 16 17 int main() { 18 int n, m, k, id; 19 scanf("%d %d", &n, &m); 20 for(int i = 1; i <= n; i++) { 21 scanf("%s %d", s[i], &k); 22 for(int j = 1; j <= k; j++) { 23 scanf("%d", &id); 24 v[id].push_back(i); 25 } 26 } 27 for(int i = 1; i <= m; i++) sort(v[i].begin(), v[i].end(), cmp); 28 for(int i = 1; i <= m; i++) { 29 printf("%d %d ", i, v[i].size()); 30 for(int j = 0; j < v[i].size(); j++) { 31 printf("%s ", s[v[i][j]]); 32 } 33 } 34 return 0; 35 }
1048 Find Coins
标记,特判下m-a[i] 和a[i]相同的情况。
1 //1048 Find Coins 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 1e5 + 10; 8 int a[N], index[N]; 9 10 int main() { 11 int n, m; 12 scanf("%d %d", &n, &m); 13 for(int i = 1; i <= n; i++) { 14 scanf("%d", &a[i]); 15 index[a[i]]++; 16 } 17 sort(a + 1, a + 1 + n); 18 for(int i = 1; i <= n; i++) { 19 int other = m - a[i]; 20 if(other == a[i] && index[other] >= 2) { 21 printf("%d %d ", a[i], a[i]); 22 return 0; 23 } 24 else if(other != a[i] && index[other]) { 25 printf("%d %d ", a[i], other); 26 return 0; 27 } 28 } 29 printf("No Solution "); 30 return 0; 31 }
1049 Counting Ones
题意:询问从1-n有多少个1,11这样算两个。考虑按位计算,分以下三种情况:
当前位=0,左边*当前位数。
当前位=1,左边*当前位数 + 右边 + 1
当前位>1,(左边+1)*右边
1 //1049 Counting Ones 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long ll; 8 9 int main() { 10 ll n, base = 1, ans = 0; 11 cin >> n; 12 while(n / base) { 13 ll now = (n % (10 * base) ) / base; 14 ll left = (n / (10 * base) ), right = n % base; 15 if(now == 0) ans += left * base; 16 else if(now == 1) ans += left * base + right + 1; 17 else ans += (left + 1) * base; 18 base *= 10; 19 } 20 cout << ans << endl; 21 return 0; 22 }
1050 String Subtraction
map一下就可以了。
1 //1050 String Subtraction 2 #include <map> 3 #include <cstdio> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 1e4 + 10; 9 char s[N]; 10 map <char, int> m; 11 12 int main() { 13 char c; 14 int cnt = 0; 15 while(scanf("%c", &s[++cnt]) != EOF && s[cnt] != ' '); 16 while(scanf("%c", &c) != EOF && c != ' ') { 17 m[c]++; 18 } 19 for(int i = 1; i <= cnt; i++) { 20 if(!m[s[i]]) printf("%c", s[i]); 21 } 22 return 0; 23 }
1051 Pop Sequence
模拟入栈操作,如果遍历到的数刚好和栈定元素相同,出栈一个元素,遍历位置+1,在比较直到不同,入栈过程中需要注意判断栈容量。
1 //1051 Pop Sequence 2 #include <stack> 3 #include <cstdio> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 1234; 9 int a[N]; 10 stack<int> s; 11 12 int main() { 13 int m, n, k; 14 scanf("%d %d %d", &m, &n, &k); 15 while(k--) { 16 int now = 1; 17 bool f = 1; 18 while(s.size()) s.pop(); 19 for(int i = 1; i <= n; i++) scanf("%d", &a[i]); 20 for(int i = 1; i <= n; i++) { 21 s.push(i); 22 if(a[now] == s.top() && s.size() <= m) { 23 while(s.size() && a[now] == s.top()) { 24 now++; 25 s.pop(); 26 } 27 } 28 else if(s.size() > m) { 29 f = 0; 30 break; 31 } 32 } 33 if(s.size()) f = 0; 34 if(f) printf("YES "); 35 else printf("NO "); 36 } 37 return 0; 38 }
1052 Linked List Sorting
先找到给定头节点的那条链,接着把这条链的元素拿出来按key从小到大排序。注意可能这样的链一条都没有。(输出0 -1)
1 //1052 Linked List Sorting 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 1e5 + 10; 9 int run[N], vis[N]; 10 struct node { 11 int key; 12 int now, next; 13 }p[N]; 14 15 bool cmp(node x, node y) { 16 return x.key < y.key; 17 } 18 19 void dfs(int u) { 20 if(u == -1) return ; 21 vis[u] = 1; 22 dfs(run[u]); 23 } 24 25 int main() { 26 int n, head, cnt = 0; 27 scanf("%d %d", &n, &head); 28 for(int i = 1; i <= n; i++) { 29 scanf("%d %d %d", &p[i].now, &p[i].key, &p[i].next); 30 run[p[i].now] = p[i].next; 31 } 32 dfs(head); 33 sort(p + 1, p + 1 + n, cmp); 34 for(int i = 1; i <= n; i++) { 35 if(vis[p[i].now]) { 36 p[++cnt] = p[i]; 37 } 38 } 39 if(cnt == 0) { 40 printf("0 -1 "); 41 return 0; 42 } 43 printf("%d %05d ", cnt, p[1].now); 44 for(int i = 1; i < cnt; i++) { 45 printf("%05d %d %05d ", p[i].now, p[i].key, p[i + 1].now); 46 } 47 printf("%05d %d -1 ", p[cnt].now, p[cnt].key); 48 return 0; 49 }
1053 Path of Equal Weight
存边的时候先儿子节点权值从大到小排序,DFS把所有答案搜出来。
1 //1053 Path of Equal Weight 2 #include <vector> 3 #include <cstdio> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 123; 9 int n, m, s; 10 int a[N], cnt = 0; 11 vector<int> E[N], tmp; 12 vector<int> res[N]; 13 14 struct node{ 15 int w,v; 16 }b[N]; 17 18 bool cmp(node x, node y) { 19 return x.w > y.w; 20 } 21 22 void dfs(int u, int sum) { 23 if(sum > s) return ; 24 tmp.push_back(a[u]); 25 if(sum + a[u] == s && !E[u].size()) { 26 res[cnt++] = tmp; 27 } 28 for(int i = 0; i < E[u].size(); i++) { 29 dfs(E[u][i], sum + a[u]); 30 } 31 tmp.pop_back(); 32 } 33 34 35 int main() { 36 scanf("%d %d %d", &n, &m, &s); 37 for(int i = 0; i < n; i++) scanf("%d", &a[i]); 38 for(int i = 1; i <= m; i++) { 39 int u, k; 40 scanf("%d %d", &u, &k); 41 for(int j = 1; j <= k; j++) { 42 scanf("%d", &b[j].v); 43 b[j].w = a[b[j].v]; 44 } 45 sort(b + 1, b + 1 + k, cmp); 46 for(int j = 1; j <= k; j++) E[u].push_back(b[j].v); 47 } 48 dfs(0, 0); 49 for(int i = 0; i < cnt; i++) { 50 for(int j = 0; j < res[i].size(); j++) { 51 if(j == res[i].size() - 1) printf("%d ", res[i][j]); 52 else printf("%d ", res[i][j]); 53 } 54 } 55 return 0; 56 }
1054 The Dominant Color
标记颜色出现次数即可。
1 // 1054 The Dominant Color 2 #include <map> 3 #include <cstdio> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 map<int, int> cnt; 9 10 int main() { 11 int n, m, col; 12 scanf("%d %d", &n, &m); 13 for(int i = 1; i <= n; i++) { 14 for(int j = 1; j <= m; j++) { 15 scanf("%d", &col); 16 cnt[col]++; 17 if(2 * cnt[col] > n *m) { 18 printf("%d", col); 19 return 0; 20 } 21 } 22 } 23 return 0; 24 }
1055 The World's Richest
结构体排序下,暴力遍历,输出即可。
1 // 1055 The World's Richest 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 using namespace std; 7 8 const int N = 1e5 + 10; 9 struct node { 10 char name[10]; 11 int age, worth; 12 }p[N]; 13 14 bool cmp(node x, node y) { 15 if(x.worth == y.worth) { 16 if(x.age == y.age) return strcmp(x.name, y.name) < 0; 17 return x.age < y.age; 18 } 19 return x.worth > y.worth; 20 } 21 22 int main() { 23 int n, k; 24 scanf("%d %d", &n, &k); 25 for(int i = 0; i < n; i++) { 26 scanf("%s %d %d", p[i].name, &p[i].age, &p[i].worth); 27 } 28 sort(p, p + n, cmp); 29 for(int i = 1; i <= k; i++) { 30 int m, mi, mx, cnt = 0; 31 scanf("%d %d %d", &m, &mi, &mx); 32 printf("Case #%d: ", i); 33 for(int j = 0; j < n; j++) { 34 if(p[j].age >= mi && p[j].age <= mx) { 35 cnt++; 36 printf("%s %d %d ", p[j].name, p[j].age, p[j].worth); 37 } 38 if(cnt == m) break; 39 } 40 if(cnt == 0) printf("None "); 41 } 42 return 0; 43 }
1056 Mice and Rice
用队列模拟下每次遍历组的操作。每组清空,再把质量最大的入队。排名即为当前组数+1
1 // 1056 Mice and Rice 2 #include <queue> 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 const int N = 1234; 10 int w[N], ans[N]; 11 12 queue <int> q; 13 14 int main() { 15 int n, m, u, v, cnt; 16 scanf("%d %d", &n, &m); 17 for(int i = 1; i <= n; i++) scanf("%d", &w[i]); 18 for(int j = 1; j <= n; j++) { 19 scanf("%d", &v); 20 q.push(v + 1); 21 } 22 cnt = n; 23 while(q.size() != 1) { 24 int g = (cnt / m) + ( (cnt % m) > 0 ? 1 : 0 ); 25 for(int i = 0; i < g; i++) { 26 int k = q.front(); 27 for(int j = 1; j <= m; j++) { 28 if(i * m + j > cnt) break; 29 u = q.front(); 30 if(w[u] > w[k]) k = u; 31 q.pop(); 32 ans[u] = g + 1; 33 } 34 q.push(k); 35 } 36 cnt = g; 37 } 38 ans[q.front()] = 1; 39 for(int i = 1; i <= n; i++) { 40 printf("%d%c", ans[i], i == n ? ' ' : ' '); 41 } 42 return 0; 43 }
1057 Stack
模拟栈操作。查询的时候二分一下,从树状数组中存的值,查找最前面出现的中值。
1 // 1057 Stack 2 #include <stack> 3 #include <iostream> 4 #include <algorithm> 5 #define low(i) ((i)&(-i)) 6 using namespace std; 7 8 const int N = 1e5 + 10; 9 int c[N], n, u; 10 char op[10]; 11 stack <int> sta; 12 13 void add(int pos, int v) { 14 for(int i = pos; i < N; i += low(i)) c[i] += v; 15 } 16 17 int query(int pos) { 18 int res = 0; 19 for(int i = pos; i; i -= low(i)) res += c[i]; 20 return res; 21 } 22 23 int PeekMedian() { 24 int sz = (sta.size() + 1) / 2; 25 int l = 1, r = N - 10 , ans = -1; 26 while(l <= r) { 27 int mid = (l + r) / 2; 28 if(query(mid) >= sz) ans = mid, r = mid - 1; 29 else l = mid + 1; 30 } 31 return ans; 32 } 33 34 int main() { 35 scanf("%d", &n); 36 while(n--) { 37 scanf("%s", op); 38 if(op[1] == 'u') { 39 scanf("%d", &u); 40 add(u, 1); 41 sta.push(u); 42 } 43 else if(op[1] == 'o') { 44 if(sta.empty()) printf("Invalid "); 45 else { 46 printf("%d ", sta.top()); 47 add(sta.top(), -1); 48 sta.pop(); 49 } 50 } else { 51 if(sta.empty()) printf("Invalid "); 52 else { 53 printf("%d ", PeekMedian()); 54 } 55 } 56 } 57 return 0; 58 }
1058 A+B in Hogwarts
水题。
1 // 1058 A+B in Hogwarts 2 #include <cstdio> 3 using namespace std; 4 5 int a[6]; 6 7 int main() { 8 9 scanf("%d.%d.%d %d.%d.%d", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); 10 if(a[2] + a[5] >= 29) { 11 a[1]++; 12 a[2] -= 29; 13 } 14 if(a[1] + a[4] >= 17) { 15 a[0]++; 16 a[1] -= 17; 17 } 18 printf("%d.%d.%d", a[0] + a[3], a[1] + a[4], a[2] + a[5]); 19 return 0; 20 }
1059 Prime Factors
暴力sqrt(n)判断下,对应输出即可。
1 //1059 Prime Factors 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long ll; 8 9 int main() { 10 bool f = 0; 11 ll n; 12 scanf("%lld", &n); 13 printf("%lld=", n); 14 for(ll i = 2; i * i <= n; i++) { 15 if(n % i == 0) { 16 ll cnt = 0; 17 while(n % i == 0) { 18 n /= i; 19 cnt++; 20 } 21 if(!f) { 22 printf("%lld", i), f = 1; 23 } else { 24 printf("*%lld", i); 25 } 26 if(cnt > 1) printf("^%lld", cnt); 27 } 28 } 29 if(n > 1) { 30 if(!f) { 31 printf("%lld", n); 32 } else { 33 printf("*%lld", n); 34 } 35 } 36 return 0; 37 }
1060 Are They Equal
这题自己的写法一直只有21分(心态炸了)。搜了波题解,发现怎么还有前导0这种输入啊(妈耶),还要注意不够位要拿0去补。
1 //1060 Are They Equal 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 int n; 8 9 string solve(string s, int& k) { 10 int i = 0 , cnt = 0; 11 string res = ""; 12 while(s.size() && s[0] == '0') { 13 s.erase(s.begin()); 14 } 15 if(s[0] == '.') { 16 s.erase(s.begin()); 17 while(s.size() && s[0] == '0') { 18 s.erase(s.begin()); 19 k--; 20 } 21 } else { 22 while(i < s.size() && s[i] != '.') { 23 i++; 24 k++; 25 } 26 if(i < s.size()) s.erase(s.begin() + i); 27 } 28 if(s.size() == 0) k = 0; 29 i = 0; 30 while(cnt < n) { 31 if(i < s.size()) res = res + s[i++]; 32 else res = res + "0"; 33 cnt++; 34 } 35 return res; 36 } 37 38 int main() { 39 int k1 = 0, k2 = 0; 40 string s1, s2, s3, s4; 41 cin >> n >> s1 >> s2; 42 s3 = solve(s1, k1); 43 s4 = solve(s2, k2); 44 if(s3 == s4 && k1 == k2) { 45 cout << "YES " << "0." << s3 << "*10^" << k1 << endl; 46 } else { 47 cout << "NO " << "0." << s3 << "*10^" << k1 << " 0." << s4 << "*10^" << k2 << endl; 48 } 49 return 0; 50 }
1061 Dating
按照题目要求做即可。(题目一定多读几遍,想三遍,敲一遍)。做这题的时候太急了,题还没看清就去敲,wa了好几发。
1 // 1061 Dating 2 #include <iostream> 3 using namespace std; 4 5 string week[10] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; 6 7 int main() { 8 int pos = 0; 9 string s1, s2, s3, s4; 10 cin >> s1 >> s2 >> s3 >> s4; 11 int n = min(s1.size(), s2.size()); 12 for(int i = 0; i < n; i++) { 13 if(s1[i] >= 'A' && s1[i] <= 'G') { 14 if(s1[i] == s2[i]) { 15 pos = i + 1; 16 int k = (s1[i] - 'A'); 17 cout << week[k]; 18 break; 19 } 20 } 21 } 22 for(int i = pos; i < n; i++) { 23 if( (s1[i] >= 'A' && s1[i] <= 'N') || (s1[i] >= '0' && s1[i] <= '9') ) { 24 if(s1[i] == s2[i]) { 25 if(s1[i] >= '0' && s1[i] <= '9') { 26 cout << " 0" << s1[i] << ":"; 27 } else { 28 int k = (s1[i] - 'A' + 10); 29 cout << " " << k << ":"; 30 } 31 break; 32 } 33 } 34 } 35 n = min(s3.size(), s4.size()); 36 for(int i = 0; i < n; i++) { 37 if(s3[i] >= 'a' && s3[i] <= 'z' || s3[i] >= 'A' && s3[i] <= 'Z') { 38 if(s3[i] == s4[i]) { 39 if(i < 10) cout << "0" << i << endl; 40 else cout << i << endl; 41 break; 42 } 43 } 44 } 45 return 0; 46 }
1062 Talent and Virtue
结构体排序,按照题目要求排序即可。
1 // 1062 Talent and Virtue 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 1e5 +10; 8 struct node{ 9 int g, id, virtue, talent, total; 10 }p[N]; 11 12 bool cmp(node x, node y) { 13 if(x.g == y.g) { 14 if(x.total == y.total) { 15 if(x.virtue == y.virtue) return x.id < y.id; 16 return x.virtue > y.virtue; 17 } 18 return x.total > y.total; 19 } 20 return x.g < y.g; 21 } 22 23 int main() { 24 int n, l, h, cnt = 0; 25 scanf("%d%d%d", &n, &l, &h); 26 for(int i = 1; i <= n; i++) { 27 scanf("%d %d %d", &p[i].id, &p[i].virtue, &p[i].talent); 28 p[i].total = p[i].virtue + p[i].talent; 29 p[i].g = 5; 30 if(p[i].virtue < l || p[i].talent < l) continue; 31 cnt++; 32 if(p[i].virtue >= h && p[i].talent >= h) { 33 p[i].g = 1; 34 } 35 else if(p[i].virtue >= h && p[i].talent < h) { 36 p[i].g = 2; 37 } 38 else if(p[i].virtue < h && p[i].talent < h && p[i].virtue >= p[i].talent) { 39 p[i].g = 3; 40 } else { 41 p[i].g= 4; 42 } 43 } 44 sort(p + 1, p + 1 + n, cmp); 45 printf("%d ", cnt); 46 for(int i = 1; i <= n; i++) { 47 if(p[i].g > 4) break; 48 printf("%08d %d %d ", p[i].id, p[i].virtue, p[i].talent); 49 } 50 return 0; 51 }