准备每天刷两题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 = ;
  11. cin >> a >> b;
  12. c = a + b;
  13. if(c == ) {
  14. cout << << endl;
  15. return ;
  16. }
  17. while(c) {
  18. if(cnt % == && cnt != ) ans = ans + ",";
  19. char ch = abs(c % ) + '';
  20. ans = ans + ch;
  21. c /= ;
  22. cnt++;
  23. }
  24. reverse(ans.begin(), ans.end());
  25. if(a + b < ) ans = "-" + ans ;
  26. cout << ans << endl;
  27. return ;
  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 = , mx = ;
  13. scanf("%d", &k);
  14. for(int i = ; 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 = ; 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 >= ; i--) {
  26. if(m[i] != ) cnt++;
  27. }
  28. printf("%d", cnt);
  29. for(int i = mx; i >= ; i--) {
  30. if(m[i] != ) printf(" %d %.1f", i, m[i]);
  31. }
  32. return ;
  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 = + ;
  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(, c1) );
  18. memset(d, 0x3f, sizeof(d));
  19. d[c1] = ; cnt[c1] = ; 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] = ;
  25. for(int i = ; 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 = ; i < n; i++) {
  47. scanf("%d", &a[i]);
  48. }
  49. for(int i = ; 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 ;
  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=;
  9. vector<int> E[N];
  10. int ans[N], mx = ;
  11.  
  12. void dfs(int u, int fa, int level) {
  13. if(E[u].size()==) {
  14. mx = max(mx, level);
  15. ans[level]++;
  16. return ;
  17. }
  18. for(int i = ; i < E[u].size(); i++){
  19. int v = E[u][i];
  20. if(v != fa) dfs(v, u, level + );
  21. }
  22. }
  23.  
  24. int main() {
  25. int n, m;
  26. scanf("%d %d", &n, &m);
  27. for(int i = ; i <= m; i++) {
  28. int u, v, k;
  29. scanf("%d %d", &u, &k);
  30. for(int j = ; j <= k; j++) {
  31. scanf("%d", &v);
  32. E[u].push_back(v);
  33. }
  34. }
  35. dfs(, , );
  36. printf("%d", ans[]);
  37. for(int i = ; i <= mx; i++){
  38. printf(" %d", ans[i]);
  39. }
  40. return ;
  41. }

1005 Spell It Right

每位数字加起来,转成英文直接输出就好,注意特判0的情况

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. string s;
  6. string str[]={"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
  7. int ans[];
  8.  
  9. int main() {
  10. int num = , cnt = ;
  11. cin >> s;
  12. for(int i = ; i < s.size(); i++) {
  13. num = num + (s[i] - '');
  14. }
  15. if(num == ) {
  16. cout << str[];
  17. return ;
  18. }
  19. while(num) {
  20. ans[cnt++] = num % ;
  21. num /= ;
  22. }
  23. for(int i = cnt - ; i >= ; i--){
  24. cout << str[ ans[i] ] ;
  25. if(i != ) cout << " " ;
  26. }
  27. return ;
  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[], ans1[], ans2[];
  8.  
  9. int main() {
  10. int n, mi = INF, mx = ;
  11. scanf("%d", &n);
  12. for(int i = ; 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 * + b * + c;
  16. d = d * + e * + 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 ;
  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 + ;
  9. ll a[N];
  10.  
  11. int main() {
  12. ll k, l, r, ans = , sum = ;
  13. scanf("%lld", &k);
  14. for(int i = ; i <= k; i++) {
  15. scanf("%lld", &a[i]);
  16. }
  17. l = a[]; r = a[k];
  18. for(int i = ; i <= k; i++) {
  19. sum += a[i];
  20. if(sum < ) sum = ;
  21. if(sum > ans) {
  22. ans = sum;
  23. r = a[i];
  24. }
  25. }
  26. if(ans == ) {
  27. for(int i = ; i <= k; i++) {
  28. if(a[i] == ) {
  29. //-1 0 -1
  30. printf("0 0 0");
  31. return ;
  32. }
  33. }
  34. //-1 -1 -1
  35. printf("%lld %lld %lld", ans, l, r);
  36. return ;
  37. }
  38. for(int i = ; i <= k; i++) {
  39. if(a[i] == r) {
  40. sum = ;
  41. for(int j = i; j >= ; j--) {
  42. sum += a[j];
  43. if(sum == ans) {
  44. l = a[j];
  45. printf("%lld %lld %lld", ans, l, r);
  46. return ;
  47. }
  48. }
  49. }
  50. }
  51. return ;
  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 = , ans = ;
  9. scanf("%d", &n);
  10. for(int i = ; i <= n; i++) {
  11. scanf("%d", &k);
  12. if( k > keep) {
  13. ans += * (k - keep);
  14. } else {
  15. ans += * (keep - k);
  16. }
  17. ans += ;
  18. keep = k;
  19. }
  20. printf("%d", ans);
  21. return ;
  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 = ;
  9. int a[N];
  10. double b[N];
  11. map<int, double> m;
  12.  
  13. int main() {
  14. int k, c, mx = , cnt = ;
  15. double d;
  16. scanf("%d", &k);
  17. for(int i = ; i <= k; i++) {
  18. scanf("%d %lf", &a[i], &b[i]);
  19. }
  20. scanf("%d",&k);
  21. for(int i = ; i <= k; i++) {
  22. scanf("%d %lf", &c, &d);
  23. for(int j = ; j <= k; j++) {
  24. mx = max(mx, c + a[j]);
  25. m[(c + a[j])] += b[j] * d;
  26. }
  27. }
  28. for(int i = ; i <= mx; i++) {
  29. if(m[i] != ) cnt++;
  30. }
  31. printf("%d",cnt);
  32. for(int i = mx; i >= ; i--) {
  33. if(m[i] != ) printf(" %d %.1f", i, m[i]);
  34. }
  35. return ;
  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[], num = , k = , l = , r = 3e9, ans = 1e18;
  11.  
  12. bool check(ll mid) {
  13. ll res = , tmp = ;
  14. for(int i = n2 - ; i >= ; i--) {
  15. res = res + a[i] * tmp;
  16. tmp *= mid;
  17. }
  18. if(res == num) ans = min(ans, mid);
  19. if(res >= num || res < ) 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 == ) {
  28. swap(s1, s2); swap(n1, n2);
  29. }
  30.  
  31. for(int i = n1 - ; i >= ; i--) {
  32. if(s1[i] >= 'a' && s1[i] <= 'z') {
  33. num = num + ( (s1[i] - 'a') + ) * k;
  34. } else {
  35. num = num + (s1[i] - '') * k;
  36. }
  37. k *= radix;
  38. }
  39. for(int i = n2 - ; i >= ; i--) {
  40. if(s2[i] >= 'a' && s2[i] <= 'z') {
  41. a[i] = 1LL * ( (s2[i] - 'a') + );
  42. } else {
  43. a[i] = 1LL * (s2[i] - '');
  44. }
  45. l = max(l, a[i] + );
  46. }
  47. while(l <= r) {
  48. ll mid = (l + r) /;
  49. if(check(mid)) r = mid - ;
  50. else l = mid + ;
  51. }
  52. if(ans == 1e18) cout << "Impossible";
  53. else cout << ans;
  54. return ;
  55. }

1011 World Cup Betting

按题目模拟一下,照着输出就好。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. char ans[];
  7.  
  8. int main() {
  9. double a, b, c, res = 0.65;
  10. for(int i = ; i <= ; 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 - ) * ;
  17. for(int i = ; i <= ; i++) printf("%c ", ans[i]);
  18. printf("%.2f", res);
  19. return ;
  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 = ; 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 + , s + + n, cmpa);
  41. for(int i = ; i <= n; i++) {
  42. if(s[i].a == s[i-].a) A[s[i].id] = A[ s[i - ].id ];
  43. else A[s[i].id] = i;
  44. }
  45. sort(s + , s + + n, cmpc);
  46. for(int i = ; i <= n; i++) {
  47. if(s[i].c == s[i-].c) C[s[i].id] = C[ s[i - ].id ];
  48. else C[s[i].id] = i;
  49. }
  50. sort(s + , s + + n, cmpm);
  51. for(int i = ; i <= n; i++) {
  52. if(s[i].m == s[i-].m) M[s[i].id] = M[ s[i - ].id ];
  53. else M[s[i].id] = i;
  54. }
  55. sort(s + , s + + n, cmpe);
  56. for(int i = ; i <= n; i++) {
  57. if(s[i].e == s[i-].e) E[s[i].id] = E[ s[i - ].id ];
  58. else E[s[i].id] = i;
  59. }
  60. for(int i = ; i <= m; i++) {
  61. int level = INF;
  62. char ans;
  63. scanf("%d", &id);
  64. if(A[id] != && A[id] < level) level = A[id], ans = 'A';
  65. if(C[id] != && C[id] < level) level = C[id], ans = 'C';
  66. if(M[id] != && M[id] < level) level = M[id], ans = 'M';
  67. if(E[id] != && E[id] < level) level = E[id], ans = 'E';
  68. if(level == INF) printf("N/A\n");
  69. else printf("%d %c\n", level, ans);
  70. }
  71. return ;
  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 = ;
  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 = ; i <= m; i++) {
  25. scanf("%d %d", &u[i], &v[i]);
  26. }
  27. for(int i = ; i <= k; i++) {
  28. int cnt = ;
  29. scanf("%d", &p);
  30. for(int j = ; j <= n; j++) fa[j] = j;
  31. for(int j = ; j <= m; j++) {
  32. if(u[j] == p || v[j] == p) continue;
  33. else Union(u[j], v[j]);
  34. }
  35. for(int j = ; j <= n; j++) {
  36. if(fa[j] == j) cnt++;
  37. }
  38. printf("%d\n", cnt - );
  39. }
  40. return ;
  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 = ;
  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 = ; i <= k; i++) {
  16. int pos = ;
  17. scanf("%d", &time);
  18. for(int j = ; 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 < ) ans1[i] = + t[pos] / , ans2[i] = t[pos] % ;
  29. else ans1[i] = -;
  30. }
  31. for(int i = ; i <= q; i++) {
  32. int pos;
  33. scanf("%d", &pos);
  34. if(ans1[pos] == -) printf("Sorry\n");
  35. else printf("%02d:%02d\n", ans1[pos], ans2[pos]);
  36. }
  37. return ;
  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 = ;
  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 <= ) return false;
  16. for(int i = ; i * i <= k; i++) {
  17. if(k % i == ) return false;
  18. }
  19. return true;
  20. }
  21.  
  22. int main() {
  23. int n, d;
  24. while(scanf("%d", &n) != EOF && n >= ) {
  25. scanf("%d", &d);
  26. if(Check(n) && Check( Reverse(n, d) )) {
  27. printf("Yes\n");
  28. } else {
  29. printf("No\n");
  30. }
  31. }
  32. return ;
  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[];
  9. struct node{
  10. string name;
  11. int time, month, day, hour, minute, stuate, status;
  12. }rcd[];
  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 = ; i < ; i++) scanf("%d", &cost[i]), cost[] += cost[i];
  23. scanf("%d", &n);
  24. for(int i = ; 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 = ;
  30. else rcd[i].status = ;
  31. rcd[i].time = rcd[i].day * * + rcd[i].hour * + rcd[i].minute;
  32. }
  33. sort(rcd + , rcd + + n, cmp);
  34. for(int i = ; i <= n; i++) {
  35. if(rcd[i - ].name == rcd[i].name && rcd[i - ].status == && rcd[i].status == ) {
  36. customer[rcd[i].name].push_back(rcd[i - ]);
  37. customer[rcd[i].name].push_back(rcd[i]);
  38. }
  39. }
  40. for(auto p : customer) {
  41. double res = ;
  42. vector <node> date = p.second;
  43. cout << p.first << " ";
  44. printf("%02d\n", date[].month);
  45. for(int i = ; i < date.size(); i += ) {
  46. printf("%02d:%02d:%02d ", date[i].day, date[i].hour, date[i].minute);
  47. printf("%02d:%02d:%02d ", date[i + ].day, date[i + ].hour, date[i + ].minute);
  48. double c1 = , c2 = ;
  49. for(int j = ; j < ; j++) {
  50. if(j < date[i].hour) {
  51. c1 += cost[j] * ;
  52. } else if(j == date[i].hour) {
  53. c1 += date[i].day * cost[] * + 1.0 * date[i].minute * cost[j];
  54. }
  55. }
  56. for(int j = ; j < ; j++) {
  57. if(j < date[i + ].hour) {
  58. c2 += cost[j] * ;
  59. } else if(j == date[i + ].hour) {
  60. c2 += date[i + ].day * cost[] * + 1.0 * date[i + ].minute * cost[j];
  61. }
  62. }
  63. printf("%d $%.2f\n", date[i + ].time - date[i].time, (c2 - c1) / );
  64. res += (c2 - c1) / ;
  65. }
  66. printf("Total amount: $%.2f\n", res);
  67. }
  68.  
  69. return ;
  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 + ;
  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 = ;
  21. double ans = ;
  22. scanf("%d %d", &n, &k);
  23. for(int i = ; i <= n; i++) {
  24. int hh, mm, ss;
  25. scanf("%d:%d:%d %d", &hh, &mm, &ss, &p[i].cost);
  26. p[i].time = * hh + * mm + ss;
  27. p[i].cost *= ;
  28. }
  29. sort(p + , p + + n, cmp);
  30. for(int i = ; i <= k; i++) t[i] = * ;
  31. for(int i = ; i <= n; i++) {
  32. if(p[i].time > * ) break;
  33. int pos = ;
  34. for(int j = ; 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\n", ans/60.0/cnt);
  46. return ;
  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 = ;
  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 = , take = , bring = ;
  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 = ; 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] = ;
  43. sum += dis;
  44. bring += (c[v] - Cmax / );
  45. if(bring < ) take -= bring, bring = ;
  46. path.push_back(v);
  47. d[v] = d[u] + dis;
  48. dfs(v);
  49. vis[v] = ;
  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 = ; i <= N; i++) {
  62. scanf("%d", &c[i]);
  63. }
  64. for(int i = ; 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 = ; i< maxn; i++) d[i] = INF;
  71. d[] = ; vis[] = ;
  72. dfs();
  73. printf("%d 0", ans_take);
  74. for(int i = ; i < ans_path.size(); i++) {
  75. printf("->%d", ans_path[i]);
  76. }
  77. printf(" %d",ans_bring);
  78. return ;
  79. }

1019 General Palindromic Number

把n转换成b进制下的数,判断下该数是否回文。

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. int a[];
  6.  
  7. int main() {
  8. bool f = ;
  9. int n, m, cnt = ;
  10. cin >> n >> m;
  11. while(n) {
  12. a[++cnt] = n % m;
  13. n /= m;
  14. }
  15. for(int i = ; i <= cnt / ; i++) {
  16. if(a[i] != a[cnt - i + ]) {
  17. f = ;
  18. break;
  19. }
  20. }
  21. if(f) printf("Yes\n");
  22. else printf("No\n");
  23. for(int i = cnt; i >= ; i--) {
  24. printf("%d", a[i]);
  25. if(i != ) printf(" ");
  26. }
  27. return ;
  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 + ;
  8. int post[], in[];
  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] = -;
  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 -, l2, i - , * id);
  22. restore(l1 + len, r1 - , i + , r2, * id + );
  23. }
  24. }
  25. }
  26.  
  27. int main() {
  28. int n;
  29. cin >> n;
  30. for(int i = ; i <= n; i++) cin >> post[i];
  31. for(int i = ; i <= n; i++) cin >> in[i];
  32. restore(, n, , n, );
  33. queue <int> Q;
  34. Q.push();
  35. while(!Q.empty()) {
  36. int u = Q.front();
  37. Q.pop();
  38. if(node[ * u] != -) Q.push( * u);
  39. if(node[ * u + ] != -) Q.push( * u + );
  40. if(u != ) cout << " ";
  41. if(node[u] != -) cout << node[u];
  42. }
  43. return ;
  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 + ;
  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 = ; i < E[u].size(); i++) {
  26. int v = E[u][i];
  27. if(v != F) dfs(st, v, u, deep + );
  28. }
  29. }
  30.  
  31. int main() {
  32. int n, cnt = ;
  33. scanf("%d", &n);
  34. for(int i = ; i <= n; i++) fa[i] = i;
  35. for(int i = ; 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 = ; i <= n; i++) {
  43. if(i == fa[i]) cnt++;
  44. }
  45. if(cnt > ) {
  46. printf("Error: %d components", cnt);
  47. } else {
  48. int mx = ;
  49. for(int i = ;i <= n; i++) {
  50. dfs(i, i, -, );
  51. mx = max(mx, d[i]);
  52. }
  53. for(int i = ; i <= n; i++) {
  54. if(d[i] == mx) printf("%d\n", i);
  55. }
  56. }
  57.  
  58. return ;
  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. string s;
  8. map <string, set<int> > mp[];
  9.  
  10. int main() {
  11. int n, m, id, pos;
  12. cin >> n;
  13. for(int i = ; i <= n; i++) {
  14. cin >> id;
  15. getchar();
  16. for(int j = ; j <= ; j++) {
  17. if(j == ) {
  18. while(cin >> s) {
  19. mp[j][s].insert(id);
  20. char c = getchar();
  21. if(c == '\n') break;
  22. }
  23. continue;
  24. }
  25. getline(cin, s);
  26. mp[j][s].insert(id);
  27. }
  28. }
  29. cin >> m;
  30. for(int i = ; i <= m; i++) {
  31. char c;
  32. cin >> pos >> c;
  33. getchar();
  34. getline(cin, s);
  35. cout << pos << ": " << s << endl;
  36. if(mp[pos].find(s) != mp[pos].end()) {
  37. for(auto it : mp[pos][s]) printf("%07d\n", it);
  38. } else {
  39. printf("Not Found\n");
  40. }
  41. }
  42. return ;
  43. }

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[], s2[], ans[];
  8.  
  9. int main() {
  10. int val, cnt = ;
  11. scanf("%s", s1 + );
  12. int len = strlen(s1 + );
  13. for(int i = len; i >= ; i--) {
  14. val = * (s1[i] - '') + cnt;
  15. cnt = ;
  16. if(val >= ) val -= , cnt++;
  17. s2[i] = (val + ''); ans[i] = s2[i];
  18. }
  19. sort(s1 + , s1 + + len);
  20. sort(s2 + , s2 + + len);
  21. for(int i = ; i <= len; i++) {
  22. if(s1[i] != s2[i]) {
  23. printf("No\n");
  24. if(cnt > ) printf("1%s", ans + );
  25. else printf("%s", ans + );
  26. return ;
  27. }
  28. }
  29. printf("Yes\n");
  30. printf("%s", ans + );
  31. return ;
  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 = , j = n.size() - ; 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 = ;
  20. for(int i = m.size() - ; i >= ; i--) {
  21. int d = (m[i] - '') + (n[i] - '') + cnt;
  22. cnt = ;
  23. if(d >= ) d -= , cnt++;
  24. char c = d + '';
  25. res = c + res;
  26. }
  27. if(cnt > ) res = "" + res;
  28. return res;
  29. }
  30.  
  31. int main() {
  32. int k;
  33. string n;
  34. cin >> n >> k;
  35. for(int i = ; i <= k; i++) {
  36. if(check(n)) {
  37. cout << n << endl << i - << endl;
  38. return ;
  39. }
  40. n = cal(n);
  41. }
  42. cout << n << endl << k << endl;
  43. return ;
  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 = +;
  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 = ;
  21. scanf("%d", &n);
  22. for(int i = ; i <= n; i++) {
  23. scanf("%d", &m);
  24. for(int j = ; 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 = ;
  30. for(int j = ; j < m; j++) {
  31. if(p[cnt + j].grade == p[cnt + j - ].grade) {
  32. p[cnt + j].loc_rank = p[cnt + j - ].loc_rank;
  33. } else {
  34. p[cnt + j].loc_rank = j + ;
  35. }
  36. }
  37. cnt += m;
  38. }
  39. sort(p, p + cnt, cmp);
  40. printf("%d\n", cnt);
  41. for(int i = ; i < cnt; i++) {
  42. if(i == || p[i].grade != p[i - ].grade) {
  43. p[i].fin = i + ;
  44. } else {
  45. p[i].fin = p[i - ].fin;
  46. }
  47. printf("%013lld %d %d %d\n", p[i].id, p[i].fin, p[i].loc_num, p[i].loc_rank);
  48. }
  49. return ;
  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[];
  8.  
  9. void solve(int v) {
  10. char c1, c2;
  11. int a1 = v / , a2 = v % ;
  12. if(a1 > ) c1 = 'A' + (a1 - );
  13. else c1 = '' + a1;
  14. if(a2 > ) c2 = 'A' + (a2 - );
  15. else c2 = '' + a2;
  16. cout << c1 << c2;
  17. }
  18.  
  19. int main() {
  20. for(int i = ; i <= ; i++) cin >> c[i];
  21. cout << "#";
  22. for(int i = ; i <= ; i++) solve(c[i]);
  23. return ;
  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 + ;
  8. struct node {
  9. int id, grade;
  10. char name[];
  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) == ) {
  19. return x.id < y.id;
  20. }
  21. return strcmp(x.name, y.name) < ;
  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 = ; i <= n; i++) {
  35. scanf("%d %s %d", &p[i].id, &p[i].name, &p[i].grade);
  36. }
  37. if(k == ) {
  38. sort(p + , p + + n, cmp1);
  39. }
  40. else if(k == ){
  41. sort(p + , p + + n, cmp2);
  42. } else {
  43. sort(p + , p + + n, cmp3);
  44. }
  45. for(int i = ; i <= n; i++) {
  46. printf("%06d %s %d\n", p[i].id, p[i].name, p[i].grade);
  47. }
  48. return ;
  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 + ;
  7. int a[N];
  8.  
  9. int main() {
  10. int n, m, num;
  11. scanf("%d", &n);
  12. for(int i = ; i <= n; i++) scanf("%d", &a[i]);
  13. scanf("%d", &m);
  14. int id = , cnt = ;
  15. int mid = (n + m + ) / ;
  16. for(int i = ; 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 ;}
  21. id++;
  22. }
  23. cnt++;
  24. if(cnt == mid) {printf("%d", num); return ;}
  25. }
  26. while(cnt < mid && id < n) {
  27. cnt++;
  28. if(cnt == mid) {printf("%d", a[id]); return ;}
  29. id++;
  30. }
  31. return ;
  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 = + ;
  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, });
  30. memset(d, 0x3f, sizeof(d));
  31. d[c1] = ;
  32. while(!Q.empty()) {
  33. int u = Q.top().u;
  34. Q.pop();
  35. if(vis[u]) continue;
  36. vis[u] = ;
  37. for(int i = ; 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 != -){
  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 = ; 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] = -;
  74. print(c2);
  75. printf("%d %d", d[c2], sum[c2]);
  76. return ;
  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[];
  8.  
  9. int main() {
  10. scanf("%s", s);
  11. int n = strlen(s), n1 = (n + ) / , n2 = n - * n1;
  12. for(int i = ; i < n1 - ; i++) {
  13. printf("%c", s[i]);
  14. for(int j = ; j <= n2; j++) printf(" ");
  15. printf("%c\n", s[n - i - ]);
  16. }
  17. for(int i = n1 - ; i <= n1 + n2; i++) {
  18. printf("%c",s[i]);
  19. }
  20. return ;
  21. }

1032 Sharing 

记录下位置往后跑。重复经过的第一个位置为答案。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int N = 1e5 + ;
  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 = ; 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 != -) {
  19. vis[s1]++;
  20. s1 = nxt[s1];
  21. }
  22. while(s2 != -) {
  23. if(vis[s2]) {
  24. printf("%05d\n", s2);
  25. return ;
  26. }
  27. vis[s2]++;
  28. s2 = nxt[s2];
  29. }
  30. printf("-1\n");
  31. return ;
  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 = ;
  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 = , n;
  18. double c_max, d, d_avg, ans = , now_tank = ;
  19. scanf("%lf %lf %lf %d", &c_max, &d, &d_avg, &n);
  20. for(int i = ; i < n; i++) {
  21. scanf("%lf %lf", &sta[i].price, &sta[i].dis);
  22. }
  23. sta[n].price = ; sta[n].dis = d;
  24. sort(sta, sta + + n, cmp);
  25. if(sta[].dis != ) {
  26. printf("The maximum travel distance = 0.00\n");
  27. return ;
  28. }
  29. while(now_pos < n) {
  30. int nxt_pos = -;
  31. double min_price = INF;
  32. for(int i = now_pos + ; 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 == -) 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 = ;
  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\n", ans);
  58. } else {
  59. printf("The maximum travel distance = %.2f\n", sta[now_pos].dis + c_max * d_avg);
  60. }
  61. return ;
  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 = ;
  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 = ; i < N; i++) fa[i] = i;
  31. int cnt = ;
  32. int n, k, time;
  33. string name1, name2, name;
  34. cin >> n >> k;
  35. for(int i = ; 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 = ; i <= n; i++) {
  47. int id = fi(i);
  48. v[id].push_back(rm[i]);
  49. }
  50. for(int i = ; i <= n; i++) {
  51. if(v[i].size() > ) {
  52. int sum = , mx = ;
  53. for(int j = ; 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 > * k) ans.push_back(tmp);
  62. }
  63. }
  64. sort(ans.begin(), ans.end(), cmp);
  65. cout << ans.size() << endl;
  66. for(int i = ; i < ans.size(); i++) {
  67. cout << ans[i].name << " " << ans[i].cnt << endl;
  68. }
  69. return ;
  70. }

1035 Password 

注意输出格式。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int N = ;
  8. bool vis[N];
  9. char s1[N][], s2[N][];
  10.  
  11. int main() {
  12. int n, m, cnt = ;
  13. scanf("%d", &n);
  14. for(int i = ; i < n; i++) {
  15. scanf("%s %s", s1[i], s2[i]);
  16. m = strlen(s2[i]);
  17. for(int j = ; j < m; j++) {
  18. if(s2[i][j] == '') s2[i][j] = '@', vis[i] = ;
  19. if(s2[i][j] == '') s2[i][j] = '%', vis[i] = ;
  20. if(s2[i][j] == 'l') s2[i][j] = 'L', vis[i] = ;
  21. if(s2[i][j] == 'O') s2[i][j] = 'o', vis[i] = ;
  22. }
  23. if(vis[i]) cnt++;
  24. }
  25. if(!cnt) {
  26. if(n == ) printf("There is %d account and no account is modified\n", n);
  27. else printf("There are %d accounts and no account is modified\n", n);
  28. } else {
  29. printf("%d\n", cnt);
  30. for(int i = ; i < n; i++) {
  31. if(vis[i]) printf("%s %s\n", s1[i], s2[i]);
  32. }
  33. }
  34. return ;
  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 = ; 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() - ];
  32. cout << ans.name << " " << ans.ID << endl;
  33. } else {
  34. cout << "Absent" << endl;
  35. }
  36. if(M.size()) {
  37. ans = M[];
  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() - ];
  45. grade = ans.grade;
  46. cout << ans.name << " " << ans.ID << endl;
  47. ans = M[];
  48. cout << ans.name << " " << ans.ID << endl;
  49. grade -= ans.grade;
  50. cout << grade << endl;
  51. }
  52. return ;
  53. }

1037 Magic Coupon 

先排序,接着前面负的搞一次,后面正的搞一次。

  1. //
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. int n, m;
  8. const int N = 1e5 + ;
  9. typedef long long ll;
  10. ll a[N], b[N];
  11.  
  12. int main() {
  13. ll ans = ;
  14. scanf("%d", &n);
  15. for(int i = ; i <= n; i++) scanf("%lld", &a[i]);
  16. scanf("%d", &m);
  17. for(int i = ; i <= m; i++) scanf("%lld", &b[i]);
  18. sort(a + , a + + n);
  19. sort(b + , b + + m);
  20. for(int i = , j = ; i <= n && j <= m && b[j] < && a[i] < ; i++, j++) {
  21. ans += a[i] * b[j];
  22. }
  23. for(int i = n, j = m; i >= && j >= && b[j] > && a[i] > ; i--, j--) {
  24. ans += a[i] * b[j];
  25. }
  26. printf("%lld\n", ans);
  27. return ;
  28. }

1038 Recover the Smallest Number

使得数字最小,字符串排序的时候可以这样考虑,判断是s1 s2 小还是 s2 s1小即可。

  1. //
  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 = ;
  17. string s;
  18. cin >> n;
  19. for(int i = ; 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 = ; i < n; i++) s = s + v[i];
  26. for(int i = ; i < s.size(); i++) {
  27. if(s[i] == '' && !vis) continue;
  28. else {
  29. vis = ;
  30. cout << s[i];
  31. }
  32. }
  33. if(!vis) cout << ;
  34. return ;
  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[];
  9. map <int, int> m;
  10. const int N = + ;
  11. vector <int> v[N];
  12.  
  13. int cal() {
  14. int res = (s[] - '');
  15. res += (s[] - 'A') * ;
  16. res += (s[] - 'A') * * ;
  17. res += (s[] - 'A') * * * ;
  18. return res;
  19. }
  20.  
  21. int main() {
  22. int n, k, a, b, name, cnt = ;
  23. scanf("%d%d", &n, &k);
  24. for(int i = ; i <= k; i++) {
  25. scanf("%d%d", &a, &b);
  26. for(int j = ; j <= b; j++) {
  27. scanf("%s", s);
  28. name = cal() + ;
  29. if(!m[name]) m[name] = cnt++;
  30. v[m[name]].push_back(a);
  31. }
  32. }
  33. for(int i = ; i <= cnt; i++) sort(v[i].begin(), v[i].end());
  34. for(int i = ; i <= n; i++) {
  35. scanf("%s", s);
  36. name = cal() + ;
  37. int id = m[name];
  38. printf("%s %d", s, v[id].size());
  39. for(int j = ; j < v[id].size(); j++) {
  40. printf(" %d", v[id][j]);
  41. }
  42. printf("\n");
  43. }
  44. return ;
  45. }

1040 Longest Symmetric String

从两个扩展和从一个扩展分别跑一次,更新答案。

  1. //
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int N = ;
  8. char s[N];
  9.  
  10. int main() {
  11. int n = , ans = ;
  12. char c;
  13. while(scanf("%c", &c) != EOF && c != '\n') {
  14. s[n++] = c;
  15. }
  16. for(int k = ; k < n; k++) {
  17. int tmp = ;
  18. for(int i = ; (k - i) >= && (k + i) < n; i++) {
  19. if(s[k - i] == s[k + i]) tmp += ;
  20. else break;
  21. }
  22. ans = max(ans, tmp);
  23. }
  24. for(int k = ; k < n; k++) {
  25. int tmp = ;
  26. if(s[k] == s[k + ]) {
  27. for(int i = ; (k - i) >= && (k + + i) < n; i++) {
  28. if(s[k - i] == s[k + + i]) tmp += ;
  29. else break;
  30. }
  31. }
  32. ans = max(ans, tmp);
  33. }
  34. printf("%d\n", ans);
  35. return ;
  36. }

1041 Be Unique 

map一下,输出计数为1的即可。否则输出None

  1. #include <map>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. const int N = 1e5 + ;
  6. int a[N];
  7. map<int, int> m;
  8.  
  9. int main() {
  10. int n;
  11. cin >> n;
  12. for(int i = ; i <= n; i++) {
  13. cin >> a[i];
  14. m[a[i]]++;
  15. }
  16. for(int i = ; i <= n; i++) {
  17. if(m[a[i]] == ) {
  18. cout << a[i] << endl;
  19. return ;
  20. }
  21. }
  22. cout << "None" << endl;
  23. return ;
  24. }

1042 Shuffling Machine

存放前后结果,模拟过去即可。

  1. #include <cstdio>
  2. using namespace std;
  3.  
  4. char s[] = {'S','H','C','D','J'};
  5.  
  6. int A[], B[], in[];
  7.  
  8. int main() {
  9. int n;
  10. scanf("%d", &n);
  11. for(int i = ; i <= ; i++) A[i] = i;
  12. for(int i = ; i <= ; i++) scanf("%d", &in[i]);
  13. for(int i = ; i < n; i++) {
  14. for(int j = ; j <= ; j++) B[in[j]] = A[j];
  15. for(int j = ; j <= ; j++) A[j] = B[j];
  16. }
  17. for(int i = ; i <= ; i++) {
  18. if(i > ) printf(" ");
  19. printf("%c%d", s[(B[i]-)/], (B[i]-)%+);
  20. }
  21. return ;
  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 = ;
  7. bool f = ;
  8. int pre[N], post[N], cnt = ;
  9.  
  10. void dfs(int root, int tail) {
  11. if(root > tail) return ;
  12. int l = root + , 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 + , 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 = ; i <= n; i++) cin >> pre[i];
  29. dfs(, n);
  30. if(cnt != n) {
  31. cnt = ;
  32. f = ;
  33. dfs(, n);
  34. }
  35. if(cnt == n) {
  36. cout << "YES" << endl;
  37. for(int i = ; i <= n; i++) {
  38. if(i == ) cout << post[i];
  39. else cout << " " << post[i];
  40. }
  41. } else {
  42. cout << "NO" << endl;
  43. }
  44. return ;
  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. 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 = ; i < n; i++) {
  18. scanf("%d", &a[i]);
  19. if(i != ) a[i] += a[i - ];
  20. }
  21. for(int i = ; i < n; i++) {
  22. int val = ;
  23. if(i != ) val = a[i - ];
  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 = ; i < n; i++) {
  30. int val = ;
  31. if(i != ) val = a[i - ];
  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 + , pos + ));
  35. }
  36. }
  37. for(int i = ; i < v.size(); i++) {
  38. printf("%d-%d\n", v[i].first, v[i].second);
  39. }
  40. return ;
  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 = ;
  8. const int L = ;
  9. int a[N], dp[N], b[L];
  10.  
  11. int main() {
  12. int n, m, l, ans = ;
  13. cin >> n >> m;
  14. for(int i = ; i <= m; i++) cin >> a[i];
  15. cin >> l;
  16. for(int i = ; i <= l; i++) cin >> b[i];
  17. for(int i = l; i >= ; i--) {
  18. bool f = ;
  19. for(int j = ; j <= m; j++) {
  20. if(b[i] == a[j]) f = ;
  21. if(f) {
  22. dp[b[i]] = max(dp[b[i]] ,dp[a[j]] + );
  23. ans = max(ans, dp[b[i]]);
  24. }
  25. }
  26. }
  27. cout << ans << endl;
  28. return ;
  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 + ;
  9. int a[N];
  10.  
  11. int main() {
  12. int n, m;
  13. cin >> n;
  14. for(int i = ; i <= n; i++) {
  15. cin >> a[i];
  16. a[i] += a[i - ];
  17. }
  18. cin >> m;
  19. for(int i = ; i <= m; i++) {
  20. int l, r;
  21. cin >> l >> r;
  22. if(l > r) swap(l, r);
  23. int ans1 = a[r - ] - a[l - ];
  24. int ans2 = (a[n] - a[r - ]) + a[l - ];
  25. cout << min(ans1, ans2) << endl;
  26. }
  27. return ;
  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 = ;
  10. char s[ * N][];
  11. vector <int> v[N];
  12.  
  13. bool cmp(int a, int b) {
  14. return strcmp(s[a], s[b]) < ;
  15. }
  16.  
  17. int main() {
  18. int n, m, k, id;
  19. scanf("%d %d", &n, &m);
  20. for(int i = ; i <= n; i++) {
  21. scanf("%s %d", s[i], &k);
  22. for(int j = ; j <= k; j++) {
  23. scanf("%d", &id);
  24. v[id].push_back(i);
  25. }
  26. }
  27. for(int i = ; i <= m; i++) sort(v[i].begin(), v[i].end(), cmp);
  28. for(int i = ; i <= m; i++) {
  29. printf("%d %d\n", i, v[i].size());
  30. for(int j = ; j < v[i].size(); j++) {
  31. printf("%s\n", s[v[i][j]]);
  32. }
  33. }
  34. return ;
  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 + ;
  8. int a[N], index[N];
  9.  
  10. int main() {
  11. int n, m;
  12. scanf("%d %d", &n, &m);
  13. for(int i = ; i <= n; i++) {
  14. scanf("%d", &a[i]);
  15. index[a[i]]++;
  16. }
  17. sort(a + , a + + n);
  18. for(int i = ; i <= n; i++) {
  19. int other = m - a[i];
  20. if(other == a[i] && index[other] >= ) {
  21. printf("%d %d\n", a[i], a[i]);
  22. return ;
  23. }
  24. else if(other != a[i] && index[other]) {
  25. printf("%d %d\n", a[i], other);
  26. return ;
  27. }
  28. }
  29. printf("No Solution\n");
  30. return ;
  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 = , ans = ;
  11. cin >> n;
  12. while(n / base) {
  13. ll now = (n % ( * base) ) / base;
  14. ll left = (n / ( * base) ), right = n % base;
  15. if(now == ) ans += left * base;
  16. else if(now == ) ans += left * base + right + ;
  17. else ans += (left + ) * base;
  18. base *= ;
  19. }
  20. cout << ans << endl;
  21. return ;
  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 + ;
  9. char s[N];
  10. map <char, int> m;
  11.  
  12. int main() {
  13. char c;
  14. int cnt = ;
  15. while(scanf("%c", &s[++cnt]) != EOF && s[cnt] != '\n');
  16. while(scanf("%c", &c) != EOF && c != '\n') {
  17. m[c]++;
  18. }
  19. for(int i = ; i <= cnt; i++) {
  20. if(!m[s[i]]) printf("%c", s[i]);
  21. }
  22. return ;
  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 = ;
  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 = ;
  17. bool f = ;
  18. while(s.size()) s.pop();
  19. for(int i = ; i <= n; i++) scanf("%d", &a[i]);
  20. for(int i = ; 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 = ;
  30. break;
  31. }
  32. }
  33. if(s.size()) f = ;
  34. if(f) printf("YES\n");
  35. else printf("NO\n");
  36. }
  37. return ;
  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 + ;
  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 == -) return ;
  21. vis[u] = ;
  22. dfs(run[u]);
  23. }
  24.  
  25. int main() {
  26. int n, head, cnt = ;
  27. scanf("%d %d", &n, &head);
  28. for(int i = ; 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 + , p + + n, cmp);
  34. for(int i = ; i <= n; i++) {
  35. if(vis[p[i].now]) {
  36. p[++cnt] = p[i];
  37. }
  38. }
  39. if(cnt == ) {
  40. printf("0 -1\n");
  41. return ;
  42. }
  43. printf("%d %05d\n", cnt, p[].now);
  44. for(int i = ; i < cnt; i++) {
  45. printf("%05d %d %05d\n", p[i].now, p[i].key, p[i + ].now);
  46. }
  47. printf("%05d %d -1\n", p[cnt].now, p[cnt].key);
  48. return ;
  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 = ;
  9. int n, m, s;
  10. int a[N], cnt = ;
  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 = ; i < E[u].size(); i++) {
  29. dfs(E[u][i], sum + a[u]);
  30. }
  31. tmp.pop_back();
  32. }
  33.  
  34. int main() {
  35. scanf("%d %d %d", &n, &m, &s);
  36. for(int i = ; i < n; i++) scanf("%d", &a[i]);
  37. for(int i = ; i <= m; i++) {
  38. int u, k;
  39. scanf("%d %d", &u, &k);
  40. for(int j = ; j <= k; j++) {
  41. scanf("%d", &b[j].v);
  42. b[j].w = a[b[j].v];
  43. }
  44. sort(b + , b + + k, cmp);
  45. for(int j = ; j <= k; j++) E[u].push_back(b[j].v);
  46. }
  47. dfs(, );
  48. for(int i = ; i < cnt; i++) {
  49. for(int j = ; j < res[i].size(); j++) {
  50. if(j == res[i].size() - ) printf("%d\n", res[i][j]);
  51. else printf("%d ", res[i][j]);
  52. }
  53. }
  54. return ;
  55. }

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 = ; i <= n; i++) {
  14. for(int j = ; j <= m; j++) {
  15. scanf("%d", &col);
  16. cnt[col]++;
  17. if( * cnt[col] > n *m) {
  18. printf("%d", col);
  19. return ;
  20. }
  21. }
  22. }
  23. return ;
  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 + ;
  9. struct node {
  10. char name[];
  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) < ;
  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 = ; 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 = ; i <= k; i++) {
  30. int m, mi, mx, cnt = ;
  31. scanf("%d %d %d", &m, &mi, &mx);
  32. printf("Case #%d:\n", i);
  33. for(int j = ; j < n; j++) {
  34. if(p[j].age >= mi && p[j].age <= mx) {
  35. cnt++;
  36. printf("%s %d %d\n", p[j].name, p[j].age, p[j].worth);
  37. }
  38. if(cnt == m) break;
  39. }
  40. if(cnt == ) printf("None\n");
  41. }
  42. return ;
  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 = ;
  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 = ; i <= n; i++) scanf("%d", &w[i]);
  18. for(int j = ; j <= n; j++) {
  19. scanf("%d", &v);
  20. q.push(v + );
  21. }
  22. cnt = n;
  23. while(q.size() != ) {
  24. int g = (cnt / m) + ( (cnt % m) > ? : );
  25. for(int i = ; i < g; i++) {
  26. int k = q.front();
  27. for(int j = ; 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 + ;
  33. }
  34. q.push(k);
  35. }
  36. cnt = g;
  37. }
  38. ans[q.front()] = ;
  39. for(int i = ; i <= n; i++) {
  40. printf("%d%c", ans[i], i == n ? '\n' : ' ');
  41. }
  42. return ;
  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 + ;
  9. int c[N], n, u;
  10. char op[];
  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 = ;
  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() + ) / ;
  25. int l = , r = N - , ans = -;
  26. while(l <= r) {
  27. int mid = (l + r) / ;
  28. if(query(mid) >= sz) ans = mid, r = mid - ;
  29. else l = mid + ;
  30. }
  31. return ans;
  32. }
  33.  
  34. int main() {
  35. scanf("%d", &n);
  36. while(n--) {
  37. scanf("%s", op);
  38. if(op[] == 'u') {
  39. scanf("%d", &u);
  40. add(u, );
  41. sta.push(u);
  42. }
  43. else if(op[] == 'o') {
  44. if(sta.empty()) printf("Invalid\n");
  45. else {
  46. printf("%d\n", sta.top());
  47. add(sta.top(), -);
  48. sta.pop();
  49. }
  50. } else {
  51. if(sta.empty()) printf("Invalid\n");
  52. else {
  53. printf("%d\n", PeekMedian());
  54. }
  55. }
  56. }
  57. return ;
  58. }

1058 A+B in Hogwarts

水题。

  1. // 1058 A+B in Hogwarts
  2. #include <cstdio>
  3. using namespace std;
  4.  
  5. int a[];
  6.  
  7. int main() {
  8.  
  9. scanf("%d.%d.%d %d.%d.%d", &a[], &a[], &a[], &a[], &a[], &a[]);
  10. if(a[] + a[] >= ) {
  11. a[]++;
  12. a[] -= ;
  13. }
  14. if(a[] + a[] >= ) {
  15. a[]++;
  16. a[] -= ;
  17. }
  18. printf("%d.%d.%d", a[] + a[], a[] + a[], a[] + a[]);
  19. return ;
  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 = ;
  11. ll n;
  12. scanf("%lld", &n);
  13. printf("%lld=", n);
  14. for(ll i = ; i * i <= n; i++) {
  15. if(n % i == ) {
  16. ll cnt = ;
  17. while(n % i == ) {
  18. n /= i;
  19. cnt++;
  20. }
  21. if(!f) {
  22. printf("%lld", i), f = ;
  23. } else {
  24. printf("*%lld", i);
  25. }
  26. if(cnt > ) printf("^%lld", cnt);
  27. }
  28. }
  29. if(n > ) {
  30. if(!f) {
  31. printf("%lld", n);
  32. } else {
  33. printf("*%lld", n);
  34. }
  35. }
  36. return ;
  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 = , cnt = ;
  11. string res = "";
  12. while(s.size() && s[] == '') {
  13. s.erase(s.begin());
  14. }
  15. if(s[] == '.') {
  16. s.erase(s.begin());
  17. while(s.size() && s[] == '') {
  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() == ) k = ;
  29. i = ;
  30. while(cnt < n) {
  31. if(i < s.size()) res = res + s[i++];
  32. else res = res + "";
  33. cnt++;
  34. }
  35. return res;
  36. }
  37.  
  38. int main() {
  39. int k1 = , k2 = ;
  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 ;
  50. }

1061 Dating

按照题目要求做即可。(题目一定多读几遍,想三遍,敲一遍)。做这题的时候太急了,题还没看清就去敲,wa了好几发。

  1. // 1061 Dating
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. string week[] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
  6.  
  7. int main() {
  8. int pos = ;
  9. string s1, s2, s3, s4;
  10. cin >> s1 >> s2 >> s3 >> s4;
  11. int n = min(s1.size(), s2.size());
  12. for(int i = ; i < n; i++) {
  13. if(s1[i] >= 'A' && s1[i] <= 'G') {
  14. if(s1[i] == s2[i]) {
  15. pos = i + ;
  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] >= '' && s1[i] <= '') ) {
  24. if(s1[i] == s2[i]) {
  25. if(s1[i] >= '' && s1[i] <= '') {
  26. cout << "" << s1[i] << ":";
  27. } else {
  28. int k = (s1[i] - 'A' + );
  29. cout << " " << k << ":";
  30. }
  31. break;
  32. }
  33. }
  34. }
  35. n = min(s3.size(), s4.size());
  36. for(int i = ; 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 < ) cout << "" << i << endl;
  40. else cout << i << endl;
  41. break;
  42. }
  43. }
  44. }
  45. return ;
  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 +;
  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 = ;
  25. scanf("%d%d%d", &n, &l, &h);
  26. for(int i = ; 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 = ;
  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 = ;
  34. }
  35. else if(p[i].virtue >= h && p[i].talent < h) {
  36. p[i].g = ;
  37. }
  38. else if(p[i].virtue < h && p[i].talent < h && p[i].virtue >= p[i].talent) {
  39. p[i].g = ;
  40. } else {
  41. p[i].g= ;
  42. }
  43. }
  44. sort(p + , p + + n, cmp);
  45. printf("%d\n", cnt);
  46. for(int i = ; i <= n; i++) {
  47. if(p[i].g > ) break;
  48. printf("%08d %d %d\n", p[i].id, p[i].virtue, p[i].talent);
  49. }
  50. return ;
  51. }

PAT 甲级真题题解(1-62)的更多相关文章

  1. PAT 甲级真题题解(63-120)

    2019/4/3 1063 Set Similarity n个序列分别先放进集合里去重.在询问的时候,遍历A集合中每个数,判断下该数在B集合中是否存在,统计存在个数(分子),分母就是两个集合大小减去分 ...

  2. PAT 甲级真题题解(121-155)

    1121 Damn Single 模拟 // 1121 Damn Single #include <map> #include <vector> #include <cs ...

  3. 1080 Graduate Admission——PAT甲级真题

    1080 Graduate Admission--PAT甲级练习题 It is said that in 2013, there were about 100 graduate schools rea ...

  4. PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)

    题意:有n个人,每个人有k个爱好,如果两个人有某个爱好相同,他们就处于同一个集合.问总共有多少个集合,以及每个集合有多少人,并按从大到小输出. 很明显,采用并查集.vis[k]标记爱好k第一次出现的人 ...

  5. PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)

    题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径.   对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的.   如果最短路程 ...

  6. PAT甲级真题及训练集

    正好这个"水水"的C4来了 先把甲级刷完吧.(开玩笑-2017.3.26) 这是一套"伪题解". wacao 刚才登出账号测试一下代码链接,原来是看不到..有空 ...

  7. 1018 Public Bike Management (30分) PAT甲级真题 dijkstra + dfs

    前言: 本题是我在浏览了柳神的代码后,记下的一次半转载式笔记,不经感叹柳神的强大orz,这里给出柳神的题解地址:https://blog.csdn.net/liuchuo/article/detail ...

  8. PAT甲级真题 A1025 PAT Ranking

    题目概述:Programming Ability Test (PAT) is organized by the College of Computer Science and Technology o ...

  9. PAT 甲级真题

    1019. General Palindromic Number 题意:求数N在b进制下其序列是否为回文串,并输出其在b进制下的表示. 思路:模拟N在2进制下的表示求法,“除b倒取余”,之后判断是否回 ...

随机推荐

  1. Nginx配置了解

    安装Nginx常用编译选项说明 nginx大部分常用模块,编译时./configure --help查看,以--without开头的都是默认安装. --prefix=PATH 指定nginx的安装目录 ...

  2. Dynamics 365中显示格式为URL的字段极少部分URL值录入了不显示怎么回事?

    微软动态CRM专家罗勇 ,回复318或者20190315可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 对于如下类型的字段, ...

  3. SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案

    SAP MM 采购ERP顾问咨询费限制总金额的框架协议实现方案 [业务场景] 采购部门与ERP咨询公司签订了一个框架协议,只规定不同级别顾问的人天费用,不限定这些不同级别咨询顾问的具体采购的人天数,但 ...

  4. Web API 持续集成:PostMan+Newman+Jenkins(图文讲解)

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上篇文章我们已经完成了API测试工具选型,接下来是一系列周期性的开发 ...

  5. 查看apk签名 和 keystore 的信息

    原文出处:https://www.jianshu.com/p/90b698002215 1.keytool -printcert -file ***(把apk文件下的META- INF文件夹解压出来, ...

  6. 工具资源系列之给mac装个虚拟机

    mac 系统安装虚拟机目前有两种主流软件,一种是 Parallels Desktop ,另一种是 vmware. 本教程选用的是 vmware ,因为我之前 windows 上安装的虚拟机软件就是vm ...

  7. 【English】五、颜色相关

    一.常见颜色 黑色    black    白色    white    蓝色    blue    橙色    orange    黄色    yellow        灰色    gray   ...

  8. vue(5)—— vue的路由插件—vue-router 常用属性方法

    前端路由 看到这里可能有朋友有疑惑了,前端也有路由吗?这些难道不应该是在后端部分操作的吗?确实是这样,但是现在前后端分离后,加上现在的前端框架的实用性,为的就是均衡前后端的工作量,所以在前端也有了路由 ...

  9. vim编辑器操作

    vim被称为编辑器之神,另外一个是sublime.vim较vi比较高级,vi适用于文本编辑,vim更加适合于coding.凡是vim里面的命令在vi都是适用的. vim的大众版的三种模式(其实不止三种 ...

  10. socket.io 出现的WebSocket is closed before the connection is established

    WebSocket is closed before the connection is established 最近socket.io是挺流行的,幼麟棋牌和一些好的开源项目也使用这个框架,在搭建其平 ...