1063 Set Similarity 

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

  1. // 1063 Set Similarity
  2. #include <set>
  3. #include <map>
  4. #include <cstdio>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. set <int> se[];
  10.  
  11. int main() {
  12. int n, k, m;
  13. scanf("%d", &n);
  14. for(int i = ; i <= n; i++) {
  15. scanf("%d", &m);
  16. while(m--) {
  17. scanf("%d", &k);
  18. se[i].insert(k);
  19. }
  20. }
  21. scanf("%d", &k);
  22. while(k--) {
  23. int id1, id2;
  24. double cnt = , total = ;
  25. scanf("%d %d", &id1, &id2);
  26. for(int i : se[id1]) {
  27. if(se[id2].find(i) != se[id2].end()) cnt++;
  28. }
  29. total = se[id1].size() + se[id2].size() - cnt;
  30. printf("%.1f%\n", cnt * / total);
  31. }
  32. return ;
  33. }

1064 Complete Binary Search Tree 

按照中序遍历建树。对应根节点依次填入排序好的数即可。

  1. // 1064 Complete Binary Search Tree
  2. #include <queue>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = ;
  9. int a[N], level[N], n, cnt = ;
  10.  
  11. void solve(int root) {
  12. if(root > n) return ;
  13. solve( * root);
  14. level[root] = a[++cnt];
  15. solve( * root + );
  16. }
  17.  
  18. int main() {
  19. scanf("%d", &n);
  20. for(int i = ; i <= n; i++) scanf("%d", &a[i]);
  21. sort(a + , a + + n);
  22. solve();
  23. for(int i = ; i <= n; i++) {
  24. if(i != ) printf(" ");
  25. printf("%d", level[i]);
  26. }
  27. return ;
  28. }

1065 A+B and C (64bit)

对溢出的情况特判一下。

  1. // 1065 A+B and C (64bit)
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. int main() {
  8. int t;
  9. scanf("%d", &t);
  10. for(int i = ; i <= t; i++) {
  11. ll a, b, c, sum = ;
  12. scanf("%lld %lld %lld", &a, &b, &c);
  13. sum = a + b;
  14. if(a > && b > && sum <= ) {
  15. printf("Case #%d: true\n", i);
  16. } else if(a < && b < && sum >= ) {
  17. printf("Case #%d: false\n", i);
  18. } else if(sum > c) {
  19. printf("Case #%d: true\n", i);
  20. } else {
  21. printf("Case #%d: false\n", i);
  22. }
  23. }
  24. return ;
  25. }

1066 Root of AVL Tree 

AVL模板题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef struct node;
  5. typedef node * tree;
  6.  
  7. struct node{
  8. int v, heigh;
  9. tree L,R;
  10. };
  11.  
  12. int getheigh(tree root){
  13. if(root==NULL) return ;
  14. return root->heigh;
  15. }
  16.  
  17. void updataheigh(tree root){
  18. root->heigh=max(getheigh(root->L),getheigh(root->R))+;
  19. }
  20.  
  21. int getBalance(tree root){
  22. return getheigh(root->L)-getheigh(root->R);
  23. }
  24.  
  25. void L(tree &root){
  26. tree temp;
  27. temp=root->R;
  28. root->R=temp->L;
  29. temp->L=root;
  30. updataheigh(root);
  31. updataheigh(temp);
  32. root=temp;
  33. }
  34.  
  35. void R(tree &root){
  36. tree temp;
  37. temp=root->L;
  38. root->L=temp->R;
  39. temp->R=root;
  40. updataheigh(root);
  41. updataheigh(temp);
  42. root=temp;
  43. }
  44.  
  45. void insertt(tree &root,int v){
  46. if(root==NULL){
  47. root=new node;
  48. root->v=v;
  49. root->heigh=;
  50. root->L=root->R=NULL;
  51. return;
  52. }
  53. if(v<root->v){
  54. insertt(root->L,v);
  55. updataheigh(root);
  56. if(getBalance(root)==){
  57. if(getBalance(root->L)==){
  58. R(root);
  59. }
  60. else if(getBalance(root->L)==-){
  61. L(root->L);
  62. R(root);
  63. }
  64. }
  65. }
  66. else{
  67. insertt(root->R,v);
  68. updataheigh(root);
  69. if(getBalance(root)==-){
  70. if(getBalance(root->R)==-){
  71. L(root);
  72. }
  73. else if(getBalance(root->R)==){
  74. R(root->R);
  75. L(root);
  76. }
  77. }
  78. }
  79.  
  80. }
  81.  
  82. int main(){
  83. int n;
  84. scanf("%d",&n);
  85. int x;
  86. tree root;
  87. root=NULL;
  88. for(int i=;i<n;i++){
  89. scanf("%d",&x);
  90. insertt(root,x);
  91. }
  92. printf("%d\n",root->v);
  93. return ;
  94. }

1067 Sort with Swap(0, i)

看到表排序的知识,摘录下。

表排序思想:N个数字的排列由若干个独立的环组成

分成以下三种环:

1. 环内只有一个元素,即该数已经在正确的位置上,不需要交换。
2. 环内有 n 个元素,含 0,需要交换次数是:n-1 (每一个非 0 元素都要和 0 换一下)
3. 环内有 n 个元素,不含 0,需要交换的次数是:n+1(把 0 换入换出 + 其余 n-1 个非 0 元素和 0 换一下)

  1. // 1067 Sort with Swap(0, i)
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int N = 1e5 + ;
  8. bool vis[N];
  9. int pos[N];
  10.  
  11. int main() {
  12. int n, u, ans = ;
  13. scanf("%d", &n);
  14. for(int i = ; i < n; i++) {
  15. scanf("%d", &u);
  16. pos[u] = i;
  17. }
  18. for(int i = ; i < n; i++) {
  19. if(pos[i] != i && !vis[i]) {
  20. int cnt = , j = i;
  21. do {
  22. cnt++;
  23. vis[j] = true;
  24. if(j == ) cnt -= ;
  25. j = pos[j];
  26. }while(j != i);
  27. cnt++;
  28. ans += cnt;
  29. }
  30. }
  31. printf("%d\n", ans);
  32. return ;
  33. }

1068 Find More Coins

因题目特殊的输出要求,用01背包的时候需要先用大的数填,不然如果先用小的数填,小的数会影响后面的数,最后从小的往大的拿出去即可。

  1. // 1068 Find More Coins
  2. #include <vector>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 1e4 + ;
  9. int n, m;
  10. int a[N], dp[N];
  11. vector <int> ans;
  12. bool check[N][];
  13.  
  14. int main() {
  15. scanf("%d %d", &n, &m);
  16. for(int i = ; i <= n; i++) scanf("%d", &a[i]);
  17. sort(a + , a + + n);
  18. for(int i = n; i >= ; i--) {
  19. for(int j = m; j >= a[i]; j--) {
  20. if(dp[j - a[i]] + a[i] >= dp[j]) {
  21. dp[j] = dp[j - a[i]] + a[i];
  22. check[i][j] = ;
  23. }
  24. }
  25. }
  26. if(dp[m] != m) {
  27. printf("No Solution\n");
  28. return ;
  29. }
  30. int id = ;
  31. while(m > ) {
  32. if(check[id][m]) {
  33. ans.push_back(a[id]);
  34. m -= a[id];
  35. }
  36. id++;
  37. }
  38. for(int i = ; i < ans.size(); i++) {
  39. if(i != ) printf(" ", ans[i]);
  40. printf("%d", ans[i]);
  41. }
  42. return ;
  43. }

1069 The Black Hole of Numbers

按题目模拟即可。

  1. // 1069 The Black Hole of Numbers
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. int a[];
  9. bool cmp(int a, int b) {return a > b;}
  10.  
  11. int cal1(int n) {
  12. memset(a, , sizeof(a));
  13. int cnt = , res = ;
  14. while(n) {
  15. a[++cnt] = n % ;
  16. n /= ;
  17. }
  18. sort(a + , a + + );
  19. for(int i = ; i >= ; i--) {
  20. res = res * + a[i];
  21. }
  22. return res;
  23. }
  24.  
  25. int cal2() {
  26. int res = ;
  27. sort(a + , a + + );
  28. for(int i = ; i <= ; i++) {
  29. res = res * + a[i];
  30. }
  31. return res;
  32.  
  33. }
  34.  
  35. int main() {
  36. int n;
  37. scanf("%d", &n);
  38. while() {
  39. int p1 = cal1(n);
  40. int p2 = cal2();
  41. n = p1 - p2;
  42. printf("%04d - %04d = %04d\n", p1, p2, n);
  43. if(n == || n == ) return ;
  44. }
  45. return ;
  46. }

1070 Mooncake

按每吨多少钱从大到小排序下,再取即可。

  1. // 1070 Mooncake
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int N = ;
  8.  
  9. struct node{
  10. double storage, price;
  11. }moon[N];
  12.  
  13. bool cmp(node x, node y) {
  14. return x.price * y.storage > y.price * x.storage;
  15. }
  16.  
  17. int main() {
  18. int n;
  19. double d, ans = ;
  20. scanf("%d %lf", &n, &d);
  21. for(int i = ; i <= n; i++) scanf("%lf", &moon[i].storage);
  22. for(int i = ; i <= n; i++) scanf("%lf", &moon[i].price);
  23. sort(moon + , moon + + n, cmp);
  24. for(int i = ; i <= n; i++) {
  25. if(d >= moon[i].storage) {
  26. ans += moon[i].price;
  27. d -= moon[i].storage;
  28. } else {
  29. ans += moon[i].price * (1.0 * d / moon[i].storage);
  30. break;
  31. }
  32. }
  33. printf("%.2f\n", ans);
  34. return ;
  35. }

1071 Speech Patterns

用map存下。更新答案即可。

  1. // 1071 Speech Patterns
  2. #include <map>
  3. #include <string>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. string in, tmp, ans1;
  8. map<string, int> mp;
  9. map<string, int>::iterator it;
  10.  
  11. int main(){
  12. int ans2 = ;
  13. getline(cin, in);
  14. for(int i = ; i < in.size(); i++) {
  15. if(isalnum(in[i])) {
  16. tmp += tolower(in[i]);
  17. if(i == in.size() - ) mp[tmp]++;
  18. } else {
  19. if(tmp.size()) mp[tmp]++;
  20. tmp.clear();
  21. }
  22. }
  23. for(it = mp.begin(); it!=mp.end(); it++){
  24. if(ans2 < it->second){
  25. ans2 = it -> second;
  26. ans1 = it -> first;
  27. }else if(ans2 == it -> second && ans1 > it -> first){
  28. ans1 = it -> first;
  29. }
  30. }
  31. cout << ans1 << " " << ans2 << endl;
  32. }

1072 Gas Station

以加油站为起点,跑最短路即可。

  1. //1072 Gas Station
  2. #include <queue>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. const int N=1e3+;
  10. const int INF=0x3f3f3f3f;;
  11. int n,m,k,ds,mp[N][N],dis[N],vis[N];
  12.  
  13. int toint(char s[]){
  14. int sum=;
  15. int len=strlen(s);
  16. for(int i=;i<len;i++){
  17. if(s[i]=='G') continue;
  18. sum=sum*+s[i]-'';
  19. }
  20. if(s[]=='G') return sum+n;
  21. return sum;
  22. }
  23.  
  24. void Dijkstra(int v){
  25. fill(vis,vis+N,false);
  26. fill(dis,dis+N,INF);
  27. for(int i=;i<=n+m;i++) dis[i]=mp[v][i];
  28. dis[v]=;
  29. for(int i=;i<n+m;i++){
  30. int u=-,minn=INF;
  31. for(int j=;j<=n+m;j++){
  32. if(!vis[j]&&minn>dis[j]){
  33. u=j;minn=dis[j];
  34. }
  35. }
  36. vis[u]=true;
  37. for(int j=;j<=n+m;j++){
  38. if(!vis[j]&&dis[j]>mp[u][j]+dis[u]){
  39. dis[j]=mp[u][j]+dis[u];
  40. }
  41. }
  42. }
  43. }
  44. int main(){
  45. int num,a,b;
  46. char s1[],s2[];
  47. scanf("%d %d %d %d",&n,&m,&k,&ds);
  48. fill(mp[],mp[]+N*N,INF);
  49. for(int i=;i<k;i++){
  50. scanf("%s %s %d",s1,s2,&num);
  51. a=toint(s1),b=toint(s2);
  52. mp[a][b]=mp[b][a]=num;
  53. }
  54. int id=-;
  55. double maxDis=-,minAvg=INF;
  56. for(int i=n+;i<=n+m;i++){
  57. Dijkstra(i);
  58. double avg=;
  59. double Min=INF;
  60. bool flag=false;
  61. for(int j=;j<=n;j++){
  62. if(dis[j]>ds){
  63. flag=true;
  64. break;
  65. }
  66. if(Min>dis[j]){
  67. Min=dis[j];
  68. }
  69. avg+=1.0*dis[j]/n;
  70. }
  71. if(flag) continue;
  72. if(maxDis<Min){
  73. maxDis=Min;
  74. id=i;
  75. minAvg=avg;
  76. }
  77. else if(maxDis==Min&&minAvg>avg){
  78. id=i;
  79. minAvg=avg;
  80. }
  81.  
  82. }
  83. if(id==-) printf("No Solution\n");
  84. else{
  85. printf("G%d\n",id-n);
  86. printf("%.1f %.1f\n",maxDis,minAvg);
  87. }
  88. return ;
  89. }

1073 Scientific Notation

按题意模拟即可。

  1. // 1073 Scientific Notation
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 1e4 + ;
  9. char s[N];
  10.  
  11. int main() {
  12. int n, i = ;
  13. scanf("%s", s);
  14. n = strlen(s);
  15. while(s[i] != 'E') {
  16. i++;
  17. }
  18. i++;
  19. if(s[] != '+') printf("%c", s[]);
  20. int m = ;
  21. for(int j = i + ; j < n; j++) m = * m + (s[j] - '');
  22. if(s[i] == '+') {
  23. m+=;
  24. for(int j = ; j < i - ; j++) {
  25. m--;
  26. if(m == -) printf(".");
  27. if(s[j] != '.') printf("%c", s[j]);
  28. }
  29. while(m > ) {
  30. printf("");
  31. m--;
  32. }
  33. } else {
  34. m--;
  35. printf("0.");
  36. while(m > ) {
  37. printf("");
  38. m--;
  39. }
  40. for(int j = ; j < i - ; j++) {
  41. if(s[j] != '.') printf("%c", s[j]);
  42. }
  43. }
  44. return ;
  45. }

1074 Reversing Linked List

每k个长度翻转一次。$j$位置对应交换的位置为$(2 * i + k - j - 1)$,这个只使用前半和后半交换,注意特判跳出。

  1. //1074 Reversing Linked List
  2. #include <cstdio>
  3. #include <vector>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 1e5 + ;
  9. int nxt[N], val[N], res[N];
  10.  
  11. int main() {
  12. int root, n, k, cnt = ;
  13. scanf("%d%d%d", &root, &n, &k);
  14. for(int i = ; i <= n; i++) {
  15. int u, v, w;
  16. scanf("%d%d%d", &u, &v, &w);
  17. val[u] = v; nxt[u] = w;
  18. }
  19. while(root != -) {
  20. res[cnt++] = root;
  21. root = nxt[root];
  22. }
  23. for(int i = ; i + k <= cnt; i += k) {
  24. for(int j = i; j < (i + k); j++) {
  25. if(j >= ( * i + k - j - )) break;
  26. swap(res[( * i + k - j - )], res[j]);
  27. }
  28. }
  29. for(int i = ; i < cnt - ; i++) {
  30. printf("%05d %d %05d\n", res[i], val[res[i]], res[i + ]);
  31. }
  32. printf("%05d %d -1\n", res[cnt - ], val[res[cnt - ]]);
  33. return ;
  34. }

1075 PAT Judge

结构体排序,注意一下区别提交得0分和提交没有通过编译。

  1. // 1075 PAT Judge
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 1e5 + ;
  9. int v[];
  10. int n, k, m;
  11. struct node{
  12. int q[], id, sum, ok, perfect;
  13. }p[N];
  14.  
  15. void init() {
  16. for(int i = ; i <= n; i++)
  17. for(int j = ; j <= k; j++)
  18. p[i].q[j] = -, p[i].id = i;
  19. }
  20.  
  21. bool cmp(node x, node y) {
  22. if(x.sum == y.sum) {
  23. if(x.perfect == y.perfect) return x.id < y.id;
  24. return x.perfect > y.perfect;
  25. }
  26. return x.sum > y.sum;
  27. }
  28.  
  29. int main() {
  30. int r = ;
  31. scanf("%d %d %d", &n, &k, &m);
  32. for(int i = ; i <= k; i++) scanf("%d", &v[i]);
  33. init();
  34. for(int i = ; i <= m; i++) {
  35. int uid, pid, val;
  36. scanf("%d %d", &uid, &pid);
  37. scanf("%d", &val);
  38. p[uid].q[pid] = max(p[uid].q[pid], val);
  39. }
  40. for(int i = ; i <= n; i++) {
  41. int cnt = , perfect = ;
  42. bool ok = ;
  43. for(int j = ; j <= k; j++) {
  44. if(p[i].q[j] != - && p[i].q[j] != -) cnt += p[i].q[j], ok = ;
  45. if(p[i].q[j] == v[j]) perfect++;
  46. }
  47. if(ok) p[i].ok = ;
  48. else p[i].ok = ;
  49. p[i].sum = cnt;
  50. p[i].perfect = perfect;
  51. }
  52. sort(p + , p + + n, cmp);
  53. for(int i = ; i <= n; i++) {
  54. if(p[i].ok == ) continue;
  55. if(p[i].sum != p[i - ].sum) r = i;
  56. printf("%d %05d %d", r, p[i].id, p[i].sum);
  57. for(int j = ; j <= k; j++) {
  58. if(p[i].q[j] == -) printf(" -");
  59. else if(p[i].q[j] == -) printf("");
  60. else printf(" %d",p[i].q[j]);
  61. }
  62. printf("\n");
  63. }
  64. return ;
  65. }

1076 Forwards on Weibo

DFS或BFS,DFS的时候注意剪枝。

DFS版本

  1. //1076 Forwards on Weibo
  2. #include <vector>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = ;
  9. vector <int> E[N];
  10. bool vis[N];
  11. int layer[N];
  12. int n, m, k, u, sz, ans;
  13.  
  14. void dfs(int u, int l) {
  15. vis[u] = ;
  16. layer[u] = l;
  17. if(l <= k) {
  18. for(int i = ; i < E[u].size(); i++) {
  19. int v = E[u][i];
  20. if(!vis[v] || layer[v] > l + ) {
  21. dfs(v, l + );
  22. }
  23. }
  24. }
  25. }
  26.  
  27. int main() {
  28. scanf("%d %d", &n, &k);
  29. for(int i = ; i <= n; i++) {
  30. scanf("%d", &sz);
  31. while(sz) {
  32. sz--;
  33. scanf("%d", &u);
  34. E[u].push_back(i);
  35. }
  36. }
  37. scanf("%d", &m);
  38. while(m--) {
  39. for(int i = ; i <= n; i++) vis[i] = , layer[i] = ;
  40. scanf("%d", &u);
  41. ans = ;
  42. dfs(u, );
  43. for(int i = ; i <= n; i++) if(layer[i] > ) ans++;
  44. printf("%d\n", ans - );
  45. }
  46. return ;
  47. }

BFS版本

  1. //1076 Forwards on Weibo
  2. #include <queue>
  3. #include <vector>
  4. #include <cstdio>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. const int N = ;
  10. vector <int> E[N];
  11. bool vis[N];
  12. int n, m, k, u, sz;
  13.  
  14. void bfs() {
  15. int ans = ;
  16. for(int i = ; i <= n; i++) vis[i] = ;
  17. queue < pair<int,int> > Q;
  18. Q.push(make_pair(u, ));
  19. vis[u] = ;
  20. while(!Q.empty()) {
  21. int cur = Q.front().first;
  22. int layer = Q.front().second;
  23. Q.pop();
  24. if(layer >= k) continue;
  25. for(int i = ; i < E[cur].size(); i++) {
  26. int v = E[cur][i];
  27. if(!vis[v]) {
  28. ans++;
  29. vis[v] = ;
  30. Q.push(make_pair(v, layer + ));
  31. }
  32. }
  33. }
  34. printf("%d\n", ans);
  35. }
  36.  
  37. int main() {
  38. scanf("%d %d", &n, &k);
  39. for(int i = ; i <= n; i++) {
  40. scanf("%d", &sz);
  41. while(sz) {
  42. sz--;
  43. scanf("%d", &u);
  44. E[u].push_back(i);
  45. }
  46. }
  47. scanf("%d", &m);
  48. while(m--) {
  49. scanf("%d", &u);
  50. bfs();
  51. }
  52. return ;
  53. }

1077 Kuchiguse

模拟

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

1078 Hashing

Hash二次探测。0^2,1^2,2^2...。

  1. //1078 Hashing
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. const int N = 1e4 + ;
  6. bool vis[N];
  7.  
  8. bool check(int x) {
  9. if(x < ) return false;
  10. for(int i = ; i * i <= x; i++) {
  11. if(x % i == ) return false;
  12. }
  13. return true;
  14. }
  15.  
  16. int main() {
  17. int n, m, p;
  18. cin >> m >> n;
  19. while(!check(m)) {m++;}
  20. for(int i = ; i <= n; i++) {
  21. bool f = ;
  22. cin >> p;
  23. if(i != ) printf(" ");
  24. for(int i = ; i < m; i++) {
  25. int tmp = (p + i * i) % m;
  26. if(!vis[tmp]) {
  27. f = ;
  28. printf("%d", tmp);
  29. vis[tmp] = ;
  30. break;
  31. }
  32. }
  33. if(!f) printf("-");
  34. }
  35. return ;
  36. }

1079 Total Sales of Supply Chain

从根跑一遍DFS到叶子节点。统计每个叶子节点的能够产生的销售额。

  1. //1079 Total Sales of Supply Chain
  2. #include <vector>
  3. #include <cstdio>
  4. using namespace std;
  5.  
  6. const int N = 1e5 + ;
  7. int cnt[N];
  8. bool vis[N];
  9. double p, r;
  10. double price[N];
  11. vector <int> E[N];
  12.  
  13. void dfs(int u, double val) {
  14. vis[u] = ; price[u] = val;
  15. for(int i = ; i < E[u].size(); i++) {
  16. int v = E[u][i];
  17. if(!vis[v]) dfs(v, val * ( + r / ));
  18. }
  19. }
  20.  
  21. int main() {
  22. int n, k, u;
  23. scanf("%d %lf %lf", &n, &p, &r);
  24. for(int i = ; i < n; i++) {
  25. scanf("%d", &k);
  26. if(k == ){
  27. scanf("%d", &cnt[i]);
  28. } else {
  29. while(k--) {
  30. scanf("%d", &u);
  31. E[i].push_back(u);
  32. }
  33. }
  34. }
  35. double ans = ;
  36. dfs(, p);
  37. for(int i = ; i < n; i++) {
  38. ans += price[i] * cnt[i];
  39. }
  40. printf("%.1f\n", ans);
  41. return ;
  42. }

1080 Graduate Admission

按照题意模拟,用set从小到大排序特性会方便很多。

  1. // 1080 Graduate Admission
  2. #include <set>
  3. #include <cstdio>
  4. #include <vector>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. const int N = 4e4 + ;
  10. struct Stu{
  11. int Id, Ge, Gi, Gh, Rank;
  12. int choices[];
  13. };
  14.  
  15. struct Sch{
  16. int maxn, lastRank;
  17. set<int> admit;
  18. };
  19.  
  20. bool cmp(Stu x, Stu y){
  21. if(x.Gh == y.Gh) return x.Ge > y.Ge;
  22. return x.Gh > y.Gh;
  23. }
  24.  
  25. set<int>::iterator it;
  26.  
  27. int main(){
  28. int n, m, k;
  29. scanf("%d%d%d", &n, &m, &k);
  30. vector<Sch> sch(m);
  31. vector<Stu> stu(n);
  32. for(int i = ; i < m; i++) scanf("%d", &sch[i].maxn);
  33. for(int i = ; i < n; i++){
  34. scanf("%d%d", &stu[i].Ge, &stu[i].Gi);
  35. stu[i].Id=i; stu[i].Gh = stu[i].Ge + stu[i].Gi;
  36. for(int j = ; j < k; j++) scanf("%d", &stu[i].choices[j]);
  37. }
  38. sort(stu.begin(), stu.end(), cmp);
  39. int Rank = ;
  40. for(int i = ; i < n; i++){
  41. if(i== || (stu[i].Gh == stu[i-].Gh && stu[i].Gi == stu[i-].Gi)) stu[i].Rank = Rank;
  42. else{
  43. Rank = i + ;
  44. stu[i].Rank = Rank;
  45. }
  46. }
  47. for(int i = ; i < n; i++){
  48. bool f=;
  49. for(int j = ; j < k; j++){
  50. int schid = stu[i].choices[j];
  51. if(sch[schid].maxn > ){
  52. sch[schid].admit.insert(stu[i].Id);
  53. sch[schid].maxn--;
  54. sch[schid].lastRank = stu[i].Rank;
  55. f = true;
  56. }else if(sch[schid].lastRank == stu[i].Rank) {
  57. sch[schid].admit.insert(stu[i].Id);
  58. f = true;
  59. }
  60. if(f) break;
  61. }
  62. }
  63. for(int i = ; i < m; i++){
  64. for(it = sch[i].admit.begin(); it!=sch[i].admit.end(); it++){
  65. if(it == sch[i].admit.begin()) printf("%d", *it);
  66. else printf(" %d", *it);
  67. }
  68. printf("\n");
  69. }
  70. return ;
  71. }

1081 Rational Sum

通分,注意最后若答案为0的时的格式输出。

  1. // 1081 Rational Sum
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7. ll a[], b[];
  8.  
  9. int main() {
  10. ll n, nr = , dm = ;
  11. scanf("%lld", &n);
  12. for(ll i = ; i <= n; i++) {
  13. scanf("%lld/%lld", &a[i], &b[i]);
  14. dm = b[i] / __gcd(b[i], dm) * dm;
  15. }
  16. for(ll i = ; i<= n; i++) {
  17. nr = nr + (dm / b[i]) * a[i];
  18. }
  19. ll g = __gcd(nr, dm);
  20. if(g != ) nr /= g, dm /= g;
  21. if(nr / dm) {
  22. printf("%lld", nr / dm);
  23. nr = nr - (nr / dm) * dm;
  24. if(nr != ) printf(" %lld/%lld", nr, dm);
  25. return ;
  26. }
  27. nr = nr - (nr / dm) * dm;
  28. if(nr != ) printf("%lld/%lld", nr, dm);
  29. else printf("");
  30. return ;
  31. }

1082 Read Number in Chinese

模拟,注意细节即可。

  1. // 1082 Read Number in Chinese
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. string a[] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
  8. string b[] = {"","Shi","Bai","Qian","Wan","Shi","Bai","Qian","Yi"};
  9.  
  10. int main() {
  11. int n, f = ;
  12. string s;
  13. cin >> s;
  14. if(s[] == '-') {
  15. cout << "Fu" << " ";
  16. s = s.substr();
  17. }
  18. n = s.size();
  19. reverse(s.begin(), s.end());
  20. for(int i = n - ; i >= ; i--) {
  21. if(i == n - ) {
  22. cout << a[s[i] - ''] << " " << b[i];
  23. } else {
  24. if(s[i] != '') {
  25. if(f) {
  26. cout << " " << a[];
  27. f = ;
  28. }
  29. cout << " " << a[s[i] - ''] << " " << b[i];
  30. } else {
  31. f = ;
  32. if(i == ) cout << " " << b[];
  33. }
  34. }
  35. }
  36. if(f && s[] != '') {
  37. cout << " " << a[];
  38. }
  39. if(s.size() == ) {
  40. cout << a[s[] - ''];
  41. }
  42. else if(s.size() > && s[] != ''){
  43. cout << " " << a[s[] - ''];
  44. }
  45. return ;
  46. }

1083 List Grades

结构体排序

  1. // 1083 List Grades
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int N = 2e5 + ;
  7. struct node {
  8. char name[], id[];
  9. int grade;
  10. }recoder[N];
  11.  
  12. bool cmp(node x, node y) {
  13. return x.grade > y.grade;
  14. }
  15.  
  16. int main() {
  17. bool f = ;
  18. int n;
  19. scanf("%d", &n);
  20. for(int i = ; i <= n; i++) {
  21. scanf("%s %s %d", recoder[i].name, recoder[i].id, &recoder[i].grade);
  22. }
  23. int g1, g2;
  24. scanf("%d%d", &g1, &g2);
  25. sort(recoder + , recoder + + n, cmp);
  26. for(int i = ; i <= n; i++) {
  27. if(recoder[i].grade <= g2 && recoder[i].grade >= g1) {
  28. printf("%s %s\n", recoder[i].name, recoder[i].id);
  29. f = ;
  30. }
  31. }
  32. if(!f) printf("NONE\n");
  33. return ;
  34. }

map标记一下。

  1. // 1084 Broken Keyboard
  2. #include <map>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. map <char, int> m;
  9.  
  10. int main() {
  11. char c;
  12. string s1, s2;
  13. cin >> s1 >> s2;
  14. for(int i = ; i < s2.size(); i++) {
  15. m[s2[i]] = ;
  16. if(s2[i] >= 'a' && s2[i] <= 'z') {
  17. c = s2[i] - ;
  18. m[c] = ;
  19. }
  20. else if(s2[i] >= 'A' && s2[i] <= 'Z') {
  21. c = s2[i] + ;
  22. m[c] = ;
  23. }
  24. }
  25. for(int i = ; i < s1.size(); i++) {
  26. if(!m[s1[i]]) {
  27. m[s1[i]] = ;
  28. if(s1[i] >= 'a' && s1[i] <= 'z') {
  29. c = s1[i] - ;
  30. m[c] = ;
  31. cout << c;
  32. }
  33. else if(s1[i] >= 'A' && s1[i] <= 'Z') {
  34. c = s1[i] + ;
  35. m[c] = ;
  36. cout << s1[i];
  37. } else {
  38. cout << s1[i];
  39. }
  40. }
  41. }
  42. return ;
  43. }

1085 Perfect Sequence

二分搜索

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

1086 Tree Traversals Again

由题目可以得知push的时候为往下找,分情况讨论存左孩子还是右孩子,pop的时候表示往右走,下一次push存右孩子,最后后序遍历一下即可。

  1. // 1086 Tree Traversals Again
  2. #include <stack>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. char s[];
  9. struct node{
  10. int lch, rch;
  11. }tree[];
  12. stack <int> sta;
  13. int n, u, fa, root = -, child = ;
  14.  
  15. void postorder(int u) {
  16. if(tree[u].lch != ) postorder(tree[u].lch);
  17. if(tree[u].rch != ) postorder(tree[u].rch);
  18. if(u == root) printf("%d", u);
  19. else printf("%d ", u);
  20. }
  21.  
  22. int main() {
  23. scanf("%d", &n);
  24. n *= ;
  25. while(n--) {
  26. scanf("%s", s);
  27. if(s[] == 'u') {
  28. scanf("%d", &u);
  29. sta.push(u);
  30. if(root == -) {
  31. root = u;
  32. } else {
  33. if(child == ) tree[fa].lch = u;
  34. else tree[fa].rch = u;
  35. }
  36. fa = u;
  37. child = ;
  38. } else {
  39. if(sta.size())
  40. fa = sta.top();
  41. sta.pop();
  42. child = ;
  43. }
  44. }
  45. postorder(root);
  46. return ;
  47. }

1087 All Roads Lead to Rome

先Floyd得到最短路,再DFS搜,搜的过程中更新答案。

  1. // 1087 All Roads Lead to Rome
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. const int N = ;
  6. int n, m, cost, cnt = , maxhappy = ;
  7. int happy[N], d[N][N];
  8. string s[N], s1, s2;
  9. map<string, int> mp;
  10. vector<int> E[N], res, ans;
  11. bool vis[N];
  12.  
  13. void dfs(int u, int en, int co) {
  14. if(u == en && co == cost) {
  15. int sum = ;
  16. for(int i = ; i < res.size(); i++) {
  17. sum += happy[res[i]];
  18. }
  19. if(sum > maxhappy) {
  20. maxhappy = sum;
  21. ans.clear();
  22. for(int i = ; i < res.size(); i++) ans.push_back(res[i]);
  23. }
  24. else if(sum == maxhappy && res.size() < ans.size()) {
  25. ans.clear();
  26. for(int i = ; i < res.size(); i++) ans.push_back(res[i]);
  27. }
  28. cnt++;
  29. return ;
  30. }
  31. for(int k = ; k < E[u].size(); k++) {
  32. int v = E[u][k];
  33. if(vis[v]) continue;
  34. res.push_back(v);
  35. vis[v] = ;
  36. dfs(v, en, co + d[u][v]);
  37. vis[v] = ;
  38. res.pop_back();
  39. }
  40. }
  41.  
  42. int main() {
  43. cin >> n >> m >> s[];
  44. mp[s[]] = ;
  45. memset(d, 0x3f, sizeof(d));
  46. for(int i = ; i <= n; i++) d[i][i] = ;
  47. for(int i = ; i <= n; i++) {
  48. cin >> s[i] >> happy[i];
  49. mp[s[i]] = i;
  50. }
  51. for(int i = ; i <= m; i++) {
  52. cin >> s1 >> s2 >> cost;
  53. d[mp[s1]][mp[s2]] = cost;
  54. d[mp[s2]][mp[s1]] = cost;
  55. E[mp[s2]].push_back(mp[s1]);
  56. E[mp[s1]].push_back(mp[s2]);
  57. }
  58.  
  59. for(int k = ; k <= n; k++)
  60. for(int i = ; i <= n; i++)
  61. for(int j = ; j <= n; j++)
  62. d[i][j] = min(d[i][j] ,d[i][k] + d[k][j]);
  63.  
  64. cost = d[mp[s[]]][mp["ROM"]];
  65. vis[mp[s[]]] = ;
  66. dfs(mp[s[]], mp["ROM"], );
  67.  
  68. cout << cnt << " " << cost << " " << maxhappy << " " << maxhappy / ans.size() << endl;
  69. cout << s[];
  70. for(int i = ; i < ans.size(); i++) cout << "->" << s[ans[i]];
  71. return ;
  72. }

1088 Rational Arithmetic

注意相乘会爆long long,判断负可以分别判断x 和 y

  1. // 1088 Rational Arithmetic
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. ll gcd(ll a, ll b) {
  7. return b == ? a : gcd(b, a % b);
  8. }
  9.  
  10. void func(ll x, ll y) {
  11. bool f = ;
  12. if(x * y == ) {
  13. if(y == ) printf("Inf");
  14. else if(x == ) printf("");
  15. return ;
  16. }
  17. if((x > && y < ) || (x < && y > )) f = ;
  18. x = abs(x); y = abs(y);
  19. ll val = x / y;
  20. ll res = x - val * y;
  21. if(f) printf("(-");
  22. if(val != ) printf("%lld", val);
  23. if(res == ) {
  24. if(f) printf(")");
  25. return ;
  26. }
  27. if(val != ) printf(" ");
  28. ll g = gcd(res, y);
  29. res /= g; y /= g;
  30. printf("%lld/%lld", res, y);
  31. if(f) printf(")");
  32. }
  33.  
  34. int main() {
  35. ll a, b, c, d;
  36. scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
  37. func(a, b);printf(" + ");func(c, d);printf(" = ");func(a * d + b * c, b * d);printf("\n");
  38. func(a, b);printf(" - ");func(c, d);printf(" = ");func(a * d - b * c, b * d);printf("\n");
  39. func(a, b);printf(" * ");func(c, d);printf(" = ");func(a * c, b * d);printf("\n");
  40. func(a, b);printf(" / ");func(c, d);printf(" = ");func(a * d, b * c);
  41. return ;
  42. }

1089 Insert or Merge

先判断是否为插入排序,不是的话,跑一遍归并,直到a数组和b数组一样,再进行一次归并操作。

  1. // 1089 Insert or Merge
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int N = ;
  7. int a[N], b[N];
  8.  
  9. int main() {
  10. int n, i, j;
  11. cin >> n;
  12. for (i = ; i < n; i++) cin >> a[i];
  13. for (i = ; i < n; i++) cin >> b[i];
  14. for (i = ; i < n - && b[i] <= b[i + ]; i++);
  15. for (j = i + ; a[j] == b[j] && j < n; j++);
  16. if (j == n) {
  17. cout << "Insertion Sort" << endl;
  18. sort(a, a + i + );
  19. } else {
  20. cout << "Merge Sort" << endl;
  21. int k = , f = ;
  22. while(f) {
  23. f = ;
  24. for (i = ; i < n; i++) {
  25. if (a[i] != b[i]) f = ;
  26. }
  27. k = k * ;
  28. for (i = ; i < n / k; i++)
  29. sort(a + i * k, a + (i + ) * k);
  30. sort(a + n / k * k, a + n);
  31. }
  32. }
  33. for(j = ; j < n; j++) {
  34. if (j != ) cout << " ";
  35. cout << a[j];
  36. }
  37. return ;
  38. }

1090 Highest Price in Supply Chain

DFS跑一遍树即可。

  1. // 1090 Highest Price in Supply Chain
  2. #include <cstdio>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. const int N = 1e5 + ;
  7. int n, u, cnt, root;
  8. double p, r, maxp = , sellp[N];
  9. vector <int> E[N];
  10.  
  11. void dfs(int a, double price) {
  12. sellp[a] = price;
  13. maxp = max(maxp, price);
  14. for(int i = ; i < E[a].size(); i++) {
  15. int b = E[a][i];
  16. dfs(b, price * (1.0 + r / ));
  17. }
  18. }
  19.  
  20. int main() {
  21. scanf("%d %lf %lf", &n, &p, &r);
  22. for(int i = ; i < n; i++) {
  23. scanf("%d", &u);
  24. if(u == -) root = i;
  25. else E[u].push_back(i);
  26. }
  27. dfs(root, p);
  28. for(int i = ; i < n; i++) {
  29. if(sellp[i] == maxp) cnt++;
  30. }
  31. printf("%.2f %d\n", maxp, cnt);
  32. return ;
  33. }

1091 Acute Stroke

3维BFS裸题。

  1. // 1091 Acute Stroke
  2. #include <queue>
  3. #include <cstdio>
  4. using namespace std;
  5.  
  6. int n, m, l, t, ans = ;
  7. int mp[][][];
  8. bool vis[][][];
  9. struct node{
  10. int z, x, y;
  11. };
  12. int dx[] = {, , , , -, };
  13. int dy[] = {, , -, , , };
  14. int dz[] = {-, , , , , };
  15.  
  16. bool check(int z, int x, int y) {
  17. if(z >= && z <= l && x >= && x <= n && y >= && y <= m) return true;
  18. return false;
  19. }
  20.  
  21. int bfs(int z, int x, int y) {
  22. queue <node> q;
  23. node tmp;
  24. int res = ;
  25. q.push(node{z, x, y});
  26. vis[z][x][y] = ;
  27. while(!q.empty()) {
  28. res++;
  29. tmp = q.front();
  30. q.pop();
  31. for(int i = ; i < ; i++) {
  32. int nz = tmp.z + dz[i];
  33. int nx = tmp.x + dx[i];
  34. int ny = tmp.y + dy[i];
  35. if(check(nz, nx, ny) && !vis[nz][nx][ny] && mp[nz][nx][ny]) {
  36. vis[nz][nx][ny] = ;
  37. q.push(node{nz, nx, ny});
  38. }
  39. }
  40.  
  41. }
  42. if(res >= t) return res;
  43. else return ;
  44. }
  45.  
  46. int main() {
  47. scanf("%d%d%d%d", &n, &m, &l, &t);
  48. for(int z = ; z <= l; z++)
  49. for(int x = ; x <= n; x++)
  50. for(int y = ; y <= m; y++)
  51. scanf("%d", &mp[z][x][y]);
  52.  
  53. for(int z = ; z <= l; z++)
  54. for(int x = ; x <= n; x++)
  55. for(int y = ; y <= m; y++)
  56. if(mp[z][x][y] && !vis[z][x][y]) ans += bfs(z, x, y);
  57.  
  58. printf("%d\n", ans);
  59. return ;
  60. }

1092 To Buy or Not to Buy

用数组标记一下即可。

  1. // 1092 To Buy or Not to Buy
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int a[];
  6. string s1, s2;
  7.  
  8. int main(){
  9. cin >> s1 >> s2;
  10. int c1 = , c2 = ;
  11. for(int i = ; i < s1.size(); i++) a[s1[i]]++;
  12. for(int i = ; i < s2.size(); i++) a[s2[i]]--;
  13. for(int i = ; i < ; i++) {
  14. if(a[i] < ) c1+=a[i];
  15. else c2+=a[i];
  16. }
  17. if(c1 < ) cout << "No " << -c1 << endl;
  18. else cout << "Yes " << c2 << endl;
  19. return ;
  20. }

1093 Count PAT's

统计一下P,A,T。在A位置计算前面有几个P,后面有几个T。

  1. // 1093 Count PAT's
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7. const int N = 1e5 + ;
  8. const ll mod = ;
  9. char s[N];
  10. ll sum[N][];
  11.  
  12. int main() {
  13. int n;
  14. ll ans = ;
  15. scanf("%s", s + );
  16. n = strlen(s + );
  17. for(int i = ; i <= n; i++) {
  18. for(int j = ; j <= ; j++) sum[i][j] = sum[i - ][j];
  19. if(s[i] == 'P') sum[i][]++;
  20. else if(s[i] == 'A') sum[i][]++;
  21. else sum[i][]++;
  22. }
  23. for(int i = ; i <= n; i++) {
  24. if(s[i] == 'A') {
  25. ans = (ans + (sum[i][] * (sum[n][] - sum[i][])) % mod) % mod;
  26. }
  27. }
  28. printf("%lld\n", ans);
  29. return ;
  30. }

1094 The Largest Generation

DFS跑下树,记录下即可。

  1. // 1094 The Largest Generation
  2. #include <vector>
  3. #include <cstdio>
  4. using namespace std;
  5.  
  6. const int N = ;
  7. int n, m, cnt[N];
  8. vector <int> children[N];
  9.  
  10. void dfs(int u, int level) {
  11. for(int i = ; i < children[u].size(); i++) {
  12. dfs(children[u][i], level + );
  13. }
  14. cnt[level]++;
  15. }
  16.  
  17. int main() {
  18. scanf("%d%d", &n, &m);
  19. while(m--) {
  20. int r, k, c;
  21. scanf("%d%d", &r, &k);
  22. while(k--) {
  23. scanf("%d", &c);
  24. children[r].push_back(c);
  25. }
  26. }
  27. dfs(, );
  28. int mx = , id;
  29. for(int i = ; i <= n; i++) {
  30. if(cnt[i] > mx) {
  31. mx = cnt[i];
  32. id = i;
  33. }
  34. }
  35. printf("%d %d\n", mx, id);
  36. return ;
  37. }

1095 Cars on Campus

按同个车牌号并以时间排序,模拟过去即可。

  1. // 1095 Cars on Campus
  2. #include <map>
  3. #include <vector>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <iostream>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. const int N = 1e4 + ;
  11. char s[N][], op[];
  12. int t[N], f[N], id[N];
  13. int cnt[ * + ], maxtime;
  14. map<string, int> m;
  15. vector <string> ans;
  16.  
  17. bool cmp(int x, int y) {
  18. if(!strcmp(s[x], s[y])) {
  19. return t[x] < t[y];
  20. } else {
  21. return strcmp(s[x], s[y]) < ;
  22. }
  23. }
  24.  
  25. int main() {
  26. int n, k, hh, mm, ss;
  27. scanf("%d%d", &n, &k);
  28. for(int i = ; i < n; i++) {
  29. id[i] = i;
  30. scanf("%s %d:%d:%d %s", s[i], &hh, &mm, &ss, op);
  31. t[i] = * hh + * mm + ss;
  32. if(op[] == 'i') f[i] = ;
  33. else f[i] = ;
  34. }
  35. sort(id, id + n, cmp);
  36. for(int i = ; i < n; i++) {
  37. if(!strcmp(s[id[i]], s[id[i - ]])) {
  38. if(f[id[i - ]] == && f[id[i]] == ) {
  39. cnt[t[id[i - ]]]++;
  40. cnt[t[id[i]]]--;
  41. m[s[id[i]]] = m[s[id[i]]] + t[id[i]] - t[id[i - ]];
  42. maxtime = max(maxtime, m[s[id[i]]]);
  43. }
  44. }
  45. }
  46. for(int i = ; i <= * ; i++) cnt[i] += cnt[i - ];
  47. while(k--) {
  48. scanf("%d:%d:%d", &hh, &mm, &ss);
  49. hh = * hh + * mm + ss;
  50. printf("%d\n", cnt[hh]);
  51. }
  52. for(int i = ; i < n; i++) {
  53. if(m[s[i]] == maxtime) {
  54. ans.push_back(s[i]);
  55. m[s[i]] = ;
  56. }
  57. }
  58. sort(ans.begin(), ans.end());
  59. for(int i = ; i < ans.size(); i++) cout << ans[i] << " ";
  60. hh = maxtime / ; maxtime -= * hh;
  61. mm = maxtime / ; maxtime -= * mm;
  62. ss = maxtime;
  63. printf("%02d:%02d:%02d\n", hh, mm, ss);
  64. return ;
  65. }

1096 Consecutive Factors

暴力找起点,然后找可以被整除的数。

  1. // 1096 Consecutive Factors
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7.  
  8. int main() {
  9. ll n, f = , maxlen = ;
  10. cin >> n;
  11. for(ll i = ; i * i <= n; i++){
  12. ll m = , j = i;
  13. for(; j * j <= n; j++) {
  14. m *= j;
  15. if(n % m != ) break;
  16. }
  17. if(j - i > maxlen) {
  18. maxlen = j - i;
  19. f = i;
  20. }
  21. }
  22. if(f == ) {
  23. cout << << endl << n << endl;
  24. return ;
  25. }
  26. cout << maxlen << endl;
  27. ll tmp = ;
  28. cout << f;
  29. for(ll i = f + ; tmp < n && (i - f) < maxlen; i++) {
  30. tmp *= i;
  31. cout << "*" << i;
  32. }
  33. return ;
  34. }

1097 Deduplication on a Linked List

从根跑下树,把仍然保留的移除的都存起来。最后输出即可。

  1. #include <map>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 1e5 + ;
  9. int nxt[N], val[N];
  10. map<int, int> m;
  11.  
  12. struct node{
  13. int u, w, v;
  14. };
  15.  
  16. vector <node> Remain, Remove;
  17.  
  18. int main() {
  19. int root, cur, n;
  20. scanf("%d %d", &root, &n);
  21. for(int i = ; i <= n; i++) {
  22. int u, v, w;
  23. scanf("%d %d %d", &u, &w, &v);
  24. nxt[u] = v;
  25. val[u] = w;
  26. }
  27. cur = root;
  28. while(cur != -) {
  29. if(!m[abs(val[cur])]) {
  30. Remain.push_back({cur, val[cur], nxt[cur]});
  31. m[abs(val[cur])] = ;
  32. } else {
  33. Remove.push_back({cur, val[cur], nxt[cur]});
  34. }
  35. cur = nxt[cur];
  36. }
  37. for(int i = ; i < Remain.size(); i++) {
  38. if(i != Remain.size() - ) printf("%05d %d %05d\n", Remain[i].u, Remain[i].w, Remain[i + ].u);
  39. else printf("%05d %d -1\n", Remain[i].u, Remain[i].w);
  40. }
  41. for(int i = ; i < Remove.size(); i++) {
  42. if(i != Remove.size() - ) printf("%05d %d %05d\n", Remove[i].u, Remove[i].w, Remove[i + ].u);
  43. else printf("%05d %d -1\n", Remove[i].u, Remove[i].w);
  44. }
  45. return ;
  46. }

1098 Insertion or Heap Sort

判断下排序类型,插入排序很容易解决,再扔个堆排序上去即可。

  1. // 1098 Insertion or Heap Sort
  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], b[N];
  10.  
  11. void solve(int l, int r) {
  12. int i = , j = ;
  13. while(j <= r) {
  14. if(j + <= r && b[j] < b[j + ]) j++;
  15. if(b[j] > b[i]) {
  16. swap(b[j], b[i]);
  17. i = j;
  18. j = * (i + ) -;
  19. } else {
  20. break;
  21. }
  22. }
  23. }
  24.  
  25. int main() {
  26. int n, k, f = ;
  27. scanf("%d", &n);
  28. for(int i = ; i < n; i++) scanf("%d", &a[i]);
  29. for(int i = ; i < n; i++) scanf("%d", &b[i]);
  30. for(k = ; k < n - && b[k] <= b[k + ]; k++) ;
  31. for(int i = k + ; i < n; i++) {
  32. if(a[i] != b[i]) {f = ; break;}
  33. }
  34. if(f) {
  35. printf("Insertion Sort\n");
  36. sort(b, b + k + );
  37. for(int i = ; i < n; i++){
  38. printf("%d", b[i]);
  39. if(i != n - ) printf(" ");
  40. }
  41. } else {
  42. printf("Heap Sort\n");
  43. int p = n - ;
  44. while(p > && b[p - ] <= b[p]) {
  45. p--;
  46. }
  47. swap(b[], b[p]);
  48. solve(, p - );
  49. for(int i = ; i < n; i++){
  50. printf("%d", b[i]);
  51. if(i != n - ) printf(" ");
  52. }
  53. }
  54. return ;
  55. }

1099 Build A Binary Search Tree

先排序,中序遍历即为填数的顺序。最后再层次遍历输出。

  1. // 1099 Build A Binary Search Tree
  2. #include <queue>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. queue <int> q;
  9. const int N = ;
  10. int lch[N], rch[N], val[N], a[N], cnt = ;
  11.  
  12. void dfs(int u) {
  13. if(lch[u] != -) dfs(lch[u]);
  14. val[u] = a[cnt++];
  15. if(rch[u] != -) dfs(rch[u]);
  16. }
  17.  
  18. int main() {
  19. int n, f = ;
  20. scanf("%d", &n);
  21. for(int i = ; i < n; i++) {
  22. int l, r;
  23. scanf("%d %d", &l, &r);
  24. lch[i] = l; rch[i] = r;
  25. }
  26. for(int i = ; i < n; i++) scanf("%d", &a[i]);
  27. sort(a, a + n);
  28. dfs();
  29. q.push();
  30. while(!q.empty()) {
  31. int cur = q.front();
  32. q.pop();
  33. if(!f) f = ;
  34. else printf(" ");
  35. printf("%d", val[cur]);
  36. if(lch[cur] != -) q.push(lch[cur]);
  37. if(rch[cur] != -) q.push(rch[cur]);
  38. }
  39. return ;
  40. }

1100 Mars Numbers

模拟。

  1. // 1100 Mars Numbers
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. string s;
  6. string str[] = {
  7. "tret", "jan", "feb", "mar", "apr", "may", "jun",
  8. "jly", "aug", "sep", "oct", "nov", "dec", "tam", "hel",
  9. "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok",
  10. "mer", "jou"
  11. };
  12.  
  13. void cal1() {
  14. if(s[] == '') {
  15. cout << "tret" << endl;
  16. return ;
  17. }
  18. int num = ;
  19. for(int i = ; i < s.size(); i++) num = * num + (s[i] - '');
  20. if(num / ) cout << str[num / + ];
  21. if((num / ) && (num % )) cout << " ";
  22. if(num % ) cout << str[num % ];
  23. cout << endl;
  24. }
  25.  
  26. void cal2() {
  27. int t1 = , t2 = ;
  28. string s1 = s.substr(, ), s2 = "";
  29. if(s.size() > ) s2 = s.substr(, );
  30. for(int i = ; i <= ; i++) {
  31. if(str[i] == s1) t1 = i;
  32. if(str[i] == s2) t2 = i;
  33. }
  34. if(t1 > ) cout << (t1 - ) * + t2 << endl;
  35. else cout << t1 + t2 << endl;
  36. }
  37.  
  38. int main() {
  39. int n;
  40. cin >> n;
  41. getchar();
  42. for(int i = ; i <= n; i++) {
  43. getline(cin, s);
  44. if(s[] >= '' && s[] <= '') cal1();
  45. else cal2();
  46. }
  47. return ;
  48. }

1101 Quick Sort

用个数组记录下从前往后,对于当前位置的最大值;从后往前,对于当前位置的最小值。最后再遍历一遍数组即可。

  1. // 1101 Quick Sort
  2. #include <vector>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. vector <int> ans;
  9. const int N = 1e5 + ;
  10. int a[N], pre[N], nxt[N];
  11.  
  12. int main() {
  13. int n;
  14. scanf("%d", &n);
  15. for(int i = ; i <= n; i++) scanf("%d", &a[i]);
  16. for(int i = ; i <= n; i++) {
  17. pre[i] = max(pre[i - ], a[i]);
  18. }
  19. nxt[n + ] = 1e9 + ;
  20. for(int i = n; i >= ; i--) {
  21. nxt[i] = min(nxt[i + ], a[i]);
  22. }
  23. for(int i = ; i <= n; i++) {
  24. if(pre[i] <= a[i] && nxt[i] >= a[i]) {
  25. ans.push_back(a[i]);
  26. }
  27. }
  28. printf("%d\n", ans.size());
  29. sort(ans.begin(), ans.end());
  30. for(int i = ; i < ans.size(); i++) {
  31. if(i == ) printf("%d", ans[i]);
  32. else printf(" %d", ans[i]);
  33. }
  34. printf("\n");
  35. return ;
  36. }

1102 Invert a Binary Tree

先找下根,中序和层序,把先左后右的顺序调换下。

  1. // 1102 Invert a Binary Tree
  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 n, root, f;
  11. int lch[N], rch[N], fa[N];
  12.  
  13. void level_order() {
  14. queue <int> q;
  15. q.push(root);
  16. while(!q.empty()) {
  17. int u = q.front();
  18. if(!f) f = ;
  19. else printf(" ");
  20. printf("%d", u);
  21. q.pop();
  22. if(rch[u] != -) q.push(rch[u]);
  23. if(lch[u] != -) q.push(lch[u]);
  24. }
  25. printf("\n");
  26. }
  27.  
  28. void in_order(int u) {
  29. if(rch[u] != -) in_order(rch[u]);
  30. if(!f) f = ;
  31. else printf(" ");
  32. printf("%d", u);
  33. if(lch[u] != -) in_order(lch[u]);
  34. }
  35.  
  36. int main() {
  37. cin >> n;
  38. memset(fa, -, sizeof(fa));
  39. memset(lch, -, sizeof(lch));
  40. memset(rch, -, sizeof(rch));
  41. for(int i = ; i < n; i++) {
  42. char c1, c2;
  43. cin >> c1 >> c2;
  44. if(c1 != '-') {
  45. lch[i] = (c1 - '');
  46. fa[(c1 - '')] = i;
  47. }
  48. if(c2 != '-') {
  49. rch[i] = (c2 - '');
  50. fa[(c2 - '')] = i;
  51. }
  52. }
  53. for(int i = ; i < n; i++){
  54. if(fa[i] == -) root = i;
  55. }
  56. f = ;
  57. level_order();
  58. f = ;
  59. in_order(root);
  60. printf("\n");
  61. return ;
  62. }

1103 Integer Factorization

预处理下,再DFS+剪枝。更新下答案。

  1. // 1103 Integer Factorization
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. int a[], b[], ans[];
  8. int n, m, k, c;
  9.  
  10. void dfs(int id, int cnt, int val) {
  11. b[cnt] = id;
  12. if(cnt > m || val > n) return ;
  13. if(val == n && cnt == m) {
  14. bool f = ;
  15. for(int i = ; i <= m; i++) {
  16. if(ans[i] != b[i]) {
  17. if(b[i] > ans[i]) f = ;
  18. break;
  19. }
  20. }
  21. for(int i = ; i <= m; i++) ans[i] = b[i];
  22. return ;
  23. }
  24. for(int i = id; i <= c && val + a[i] <= n; i++) {
  25. dfs(i, cnt + , val + a[i]);
  26. }
  27. }
  28.  
  29. int POW(int u, int v) {
  30. int res = ;
  31. for(int i = ; i <= v; i++) res *= u;
  32. return res;
  33. }
  34.  
  35. int main() {
  36. scanf("%d%d%d", &n, &m, &k);
  37. for(int i = ; POW(i, k) <= n; i++) {
  38. a[i] = POW(i, k);
  39. c = i;
  40. }
  41. for(int i = ; i <= c; i++) dfs(i, , a[i]);
  42. int res = ;
  43. for(int i = ; i <= m; i++) res += a[ans[i]];
  44. if(res == n) {
  45. printf("%d = %d^%d", n, ans[m], k);
  46. for(int i = m - ; i >= ; i--) {
  47. printf(" + %d^%d", ans[i], k);
  48. }
  49. printf("\n");
  50. } else {
  51. printf("Impossible\n");
  52. }
  53. return ;
  54. }
 
1104 Sum of Number Segments
每个位置会算到的次数为$i * (n - i + 1)$。
  1. #include <cstdio>
  2. using namespace std;
  3.  
  4. const int N = 1e5 + ;
  5. double a[N];
  6.  
  7. int main() {
  8. int n;
  9. double ans = ;
  10. scanf("%d", &n);
  11. for(int i = ; i <= n; i++) scanf("%lf", &a[i]);
  12. for(int i = ; i <= n; i++) {
  13. ans += a[i] * i * (n - i + );
  14. }
  15. printf("%.2f\n", ans);
  16. return ;
  17. }

1105 Spiral Matrix

蛇形填数,注意下细节。

  1. // 1105 Spiral Matrix
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 1e4 + ;
  9. int a[N];
  10. int ans[N][N];
  11.  
  12. int main() {
  13. int n, k;
  14. scanf("%d", &n);
  15. for(int i = ; i <= n; i++) scanf("%d", &a[i]);
  16. if(n == ) {
  17. printf("%d", a[]);
  18. return ;
  19. }
  20. sort(a + , a + + n);
  21. int m = sqrt(1.0 * n);
  22. while(n % m != ) m++;
  23. if((n / m) > m) m = n/ m;
  24. //m n/m
  25. k = n; n = n / m;
  26. int i = , j = ;
  27. int U = , D = m, L = , R = n;
  28. while(k > ) {
  29. while(k > && j < R) {
  30. ans[i][j] = a[k--];
  31. j++;
  32. }
  33. while(k > && i < D) {
  34. ans[i][j] = a[k--];
  35. i++;
  36. }
  37. while(k > && j > U) {
  38. ans[i][j] = a[k--];
  39. j--;
  40. }
  41. while(k > && i > L) {
  42. ans[i][j] = a[k--];
  43. i--;
  44. }
  45. U++; D--; L++; R--;
  46. i++; j++;
  47. if(k == ) {
  48. ans[i][j] = a[k--];
  49. }
  50. }
  51. for(int i = ; i <= m; i++) {
  52. for(int j = ; j <= n; j++) {
  53. printf("%d%c", ans[i][j], (j == n) ? '\n' : ' ');
  54. }
  55. }
  56. return ;
  57. }

1106 Lowest Price in Supply Chain

跑下树。在叶子节点更新下最小值,最后再遍历下叶子节点即可。

  1. // 1106 Lowest Price in Supply Chain
  2. #include <cstdio>
  3. #include <vector>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 1e5 + ;
  9. int n, k, id;
  10. double p, r, val[N], mi = 1e12;
  11. vector <int> E[N];
  12.  
  13. void dfs(int u) {
  14. if(E[u].size() == ) mi = min(mi, val[u]);
  15. for(int j = ; j < E[u].size(); j++) {
  16. int v = E[u][j];
  17. val[v] = val[u] * (1.0 + r / 100.0);
  18. dfs(v);
  19. }
  20. }
  21.  
  22. int main() {
  23. scanf("%d %lf %lf", &n, &p, &r);
  24. for(int i = ; i < n; i++) {
  25. scanf("%d", &k);
  26. for(int j = ; j <= k; j++) {
  27. scanf("%d", &id);
  28. E[i].push_back(id);
  29. }
  30. }
  31. val[] = p;
  32. dfs();
  33. int cnt = ;
  34. for(int i = ; i < n; i++) if(val[i] == mi && E[i].size() == ) cnt++;
  35. printf("%.4f %d\n", mi, cnt);
  36. return ;
  37. }

1107 Social Clusters

并查集搞搞。

  1. // 1107 Social Clusters
  2. #include <cstdio>
  3. #include <vector>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. const int N = 1e3 + ;
  10. vector <int> E[N], ans;
  11. int fa[N], C[N];
  12.  
  13. int fi(int x) {
  14. return x == fa[x] ? x : fa[x] = fi(fa[x]);
  15. }
  16.  
  17. void Union(int x, int y) {
  18. int fx = fi(x), fy = fi(y);
  19. if(fx != fy) {
  20. fa[fy] = fx;
  21. }
  22. }
  23.  
  24. int main() {
  25. bool f = ;
  26. int n, k, u, cnt = ;
  27. scanf("%d", &n);
  28. for(int i = ; i <= n; i++) {
  29. fa[i] = i;
  30. scanf("%d:", &k);
  31. while(k--) {
  32. scanf("%d", &u);
  33. E[u].push_back(i);
  34. }
  35. }
  36. for(int i = ; i < N; i++) {
  37. for(int j = ; j < E[i].size(); j++) {
  38. u = E[i][j];
  39. Union(u, E[i][]);
  40. }
  41. }
  42. for(int i = ; i <= n; i++) {
  43. C[fi(i)]++;
  44. if(i == fa[i]) cnt++;
  45. }
  46. printf("%d\n", cnt);
  47. for(int i = ; i <= n; i++) {
  48. if(C[i] != ) ans.push_back(C[i]);
  49. }
  50. sort(ans.begin(), ans.end());
  51. for(int i = ans.size() - ; i >= ; i--) {
  52. if(i != ans.size() - ) printf(" ");
  53. printf("%d", ans[i]);
  54. }
  55. return ;
  56. }

1108 Finding Average

注意 一个合法数字 的输出格式。

  1. // 1108 Finding Average
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. char str[];
  7.  
  8. double check() {
  9. int i = , f = , cnt = ;
  10. if(str[] == '-') i = , f = -;
  11. int m = strlen(str);
  12. for(; i < m; i++) {
  13. if(str[i] >= '' && str[i] <= '') continue;
  14. if(str[i] == '.') {
  15. cnt++;
  16. if(cnt >= ) return ;
  17. }
  18. else return ;
  19. }
  20. double res = ;
  21. i = ;
  22. if(str[] == '-') i = , f = -;
  23. for(; i < m; i++) {
  24. if(str[i] == '.') {
  25. if(i + < m) return ;
  26. if(i + < m) res += (str[i + ] - '') / 100.0;
  27. if(i + < m) res += (str[i + ] - '') / 10.0;
  28. return f * res;
  29. }
  30. res = * res + 1.0 * (str[i] - '');
  31. }
  32. return f * res;
  33. }
  34.  
  35. int main() {
  36. double average = ;
  37. int n, c = ;
  38. scanf("%d", &n);
  39. while(n--) {
  40. scanf("%s", str);
  41. double val = check();
  42. if(val >= - && val <= ) average += check(), c++;
  43. else{
  44. printf("ERROR: %s is not a legal number\n", str);
  45. }
  46. }
  47. if(c == ) printf("The average of %d number is %.2f\n", c, average / c);
  48. else if(c > ) printf("The average of %d numbers is %.2f\n", c, average / c);
  49. else printf("The average of 0 numbers is Undefined\n");
  50. return ;
  51. }

1109 Group Photo

模拟。

  1. // 1109 Group Photo
  2. #include <vector>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. struct node {
  9. int h;
  10. string name;
  11. } tmp;
  12.  
  13. bool cmp(node x, node y) {
  14. if(x.h == y.h) return x.name < y.name;
  15. return x.h > y.h;
  16. }
  17.  
  18. vector<node> p;
  19.  
  20. int main() {
  21. int n, k, per, last, id = ;
  22. cin >> n >> k;
  23. per = n / k;
  24. last = per + (n % k);
  25. for (int i = ; i <= n; i++) {
  26. cin >> tmp.name >> tmp.h;
  27. p.push_back(tmp);
  28. }
  29. sort(p.begin(), p.end(), cmp);
  30. for (int i = ; i < k; i++) {
  31. int now = per, f = -;
  32. if(i == ) now = last;
  33. int pos = now / ;
  34. vector<string> ans(n);
  35. while(pos >= && pos < now) {
  36. ans[pos] = p[id++].name;
  37. pos += f;
  38. if(f < ) {
  39. f *= -;
  40. f++;
  41. } else {
  42. f *= -;
  43. f--;
  44. }
  45. }
  46. for (int j = ; j < now; j++) {
  47. cout << ans[j];
  48. if(j != now - ) cout << " ";
  49. else cout << endl;
  50. }
  51. ans.clear();
  52. }
  53. return ;
  54. }

1110 Complete Binary Tree

完全二叉树递归出的最大下标值一定等于总节点数。

  1. // 1110 Complete Binary Tree
  2. #include <queue>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. int fa[], lch[], rch[];
  7. int n, root, last, maxindex = ;
  8.  
  9. void dfs(int u, int index) {
  10. if(u == -) return ;
  11. if(index > maxindex) {
  12. maxindex = index;
  13. last = u;
  14. }
  15. dfs(lch[u], * index);
  16. dfs(rch[u], * index + );
  17. }
  18.  
  19. int main() {
  20. cin >> n;
  21. for(int i = ; i < n; i++) fa[i] = lch[i] = rch[i] = -;
  22. for(int i = ; i < n; i++) {
  23. string s1, s2;
  24. cin >> s1 >> s2;
  25. if(s1 != "-") {
  26. fa[atoi(s1.c_str())] = i;
  27. lch[i] = atoi(s1.c_str());
  28. }
  29. if(s2 != "-") {
  30. fa[atoi(s2.c_str())] = i;
  31. rch[i] = atoi(s2.c_str());
  32. }
  33. }
  34. for(int i = ; i < n; i++) {
  35. if(fa[i] == -) root = i;
  36. }
  37. dfs(root, );
  38. if(maxindex == n) {
  39. cout << "YES " << last << endl;
  40. } else {
  41. cout << "NO " << root << endl;
  42. }
  43. return ;
  44. }

1112 Stucked Keyboard

模拟。

  1. // 1112 Stucked Keyboard
  2. #include <map>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. string str;
  7. map<char, int> ok;
  8.  
  9. int main() {
  10. int n, k, c = ;
  11. cin >> k >> str;
  12. n = str.size();
  13. for (int i = ; i < n; i++) {
  14. if(str[i] == str[i - ]) {
  15. c++;
  16. } else {
  17. if(c % k != ) ok[str[i - ]] = ;
  18. c = ;
  19. }
  20. }
  21. if(c > && c % k != ) ok[str[n - ]] = ;
  22. for (int i = ; i < n; i++) {
  23. if(ok[str[i]] == ) {
  24. cout << str[i];
  25. ok[str[i]] = -;
  26. }
  27. }
  28. cout << endl;
  29. c = ;
  30. for (int i = ; i < n; i++) {
  31. if(str[i] == str[i - ]) {
  32. c++;
  33. } else {
  34. if(c % k == ) {
  35. if(ok[str[i - ]] != ) for (int j = ; j <= c / k; j++) cout << str[i - ];
  36. else for (int j = ; j <= c; j++) cout << str[i - ];
  37. }
  38. else {
  39. for (int j = ; j <= c; j++) cout << str[i - ];
  40. }
  41. c = ;
  42. }
  43. }
  44. if(c > && c % k == ) {
  45. if(ok[str[n - ]] != ) for (int j = ; j <= c / k; j++) cout << str[n - ];
  46. else for (int j = ; j <= c; j++) cout << str[n - ];
  47. }
  48. else {
  49. for (int j = ; j <= c; j++) cout << str[n - ];
  50. }
  51. return ;
  52. }

1113 Integer Set Partition

先排序,再前面加一加,后面加一加。

  1. // 1113 Integer Set Partition
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7. const int N = 1e5 + ;
  8. ll a[N];
  9.  
  10. int main() {
  11. int n, m;
  12. ll s1 = , s2 = ;
  13. cin >> n;
  14. for (int i = ; i <= n; i++) cin >> a[i];
  15. sort(a + , a + + n);
  16. for (int i = n / + ; i <= n; i++) s1 += a[i];
  17. for (int i = ; i < n / + ; i++) s2 += a[i];
  18. cout << (n % ) << " ";
  19. cout << abs(s1 - s2) << endl;
  20. return ;
  21. }

1114 Family Property

暴力模拟即可。

  1. // 1114 Family Property
  2. #include <map>
  3. #include <vector>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = + ;
  9. int fa[N], M[N], A[N];
  10. int fi(int x) {
  11. return fa[x] == x ? x : fa[x] = fi(fa[x]);
  12. }
  13.  
  14. void Union(int x, int y) {
  15. if(x == - || y == -) return ;
  16. int fx = fi(x), fy = fi(y);
  17. if(fx != fy) {
  18. fa[fx] = fy;
  19. }
  20. }
  21.  
  22. void init() {
  23. for(int i = ; i < N; i++) fa[i] = i;
  24. }
  25.  
  26. int cnt = ;
  27. vector<int> V, E[N];
  28. map<int, int> mp;
  29.  
  30. struct node {
  31. int ansID, ansM;
  32. double avg1, avg2;
  33. }ans[N];
  34.  
  35. map<int, int> vis;
  36.  
  37. bool cmp(node x, node y) {
  38. if(x.avg2 == y.avg2) return x.ansID < y.ansID;
  39. return x.avg2 > y.avg2;
  40. }
  41.  
  42. int main() {
  43. init();
  44. int n;
  45. cin >> n;
  46. for (int i = ; i <= n; i++) {
  47. int id, father, mother, child, k;
  48. cin >> id >> father >> mother >> k;
  49. Union(id, father);
  50. if(father != -) V.push_back(father);
  51. Union(id, mother);
  52. if(mother != -) V.push_back(mother);
  53. while (k--) {
  54. cin >> child;
  55. if(child != -) V.push_back(child);
  56. Union(id, child);
  57. }
  58. V.push_back(id);
  59. cin >> M[id] >> A[id];
  60. }
  61. for (int i = ; i < V.size(); i++) {
  62. int u = V[i];
  63. if(fa[u] == u && !mp[u]) {
  64. cnt++;
  65. mp[u] = cnt;
  66. }
  67. }
  68. for (int i = ; i < V.size(); i++) {
  69. int u = V[i];
  70. if(!vis[u]) E[mp[fi(u)]].push_back(u), vis[u] = ;
  71. }
  72. for (int i = ; i <= cnt; i++) {
  73. int minid = ;
  74. double sum1 = ;
  75. double sum2 = ;
  76. for(int j = ; j < E[i].size(); j++) {
  77. int v = E[i][j];
  78. minid = min(minid, v);
  79. sum1 += M[v];
  80. sum2 += A[v];
  81. }
  82. ans[i].ansID = minid;
  83. ans[i].ansM = E[i].size();
  84. ans[i].avg1 = sum1 / E[i].size();
  85. ans[i].avg2 = sum2 / E[i].size();
  86. }
  87. sort(ans + , ans + + n, cmp);
  88. cout << cnt << endl;
  89. for (int i = ; i <= cnt; i++) {
  90. printf("%04d %d %.3f %.3f\n", ans[i].ansID, ans[i].ansM, ans[i].avg1, ans[i].avg2);
  91. }
  92. return ;
  93. }

1115 Counting Nodes in a BST

用链表实现二叉搜索树的插入。构建完树后,DFS一遍,在对应深度更新节点数。

  1. // 1115 Counting Nodes in a BST
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. struct node {
  6. int val;
  7. struct node *left, *right;
  8. };
  9.  
  10. const int N = + ;
  11. int num[N], maxd = -;
  12.  
  13. node *build(node *root, int v) {
  14. if(root == NULL) {
  15. root = new node();
  16. root -> val = v;
  17. root -> left = root -> right = NULL;
  18. } else if(v > root->val) {
  19. root->right = build(root->right, v);
  20. } else {
  21. root->left = build(root->left, v);
  22. }
  23. return root;
  24. }
  25.  
  26. void dfs(node *root, int dp) {
  27. if(root == NULL) {
  28. maxd = max(maxd, dp);
  29. return ;
  30. }
  31. num[dp]++;
  32. dfs(root->left, dp + );
  33. dfs(root->right, dp + );
  34. }
  35.  
  36. int main() {
  37. int n, k;
  38. node *root = NULL;
  39. cin >> n;
  40. while(n--) {
  41. cin >> k;
  42. root = build(root, k);
  43. }
  44. dfs(root, );
  45. cout << num[maxd - ] << " + " << num[maxd - ] << " = " << num[maxd - ] + num[maxd - ] << endl;
  46. return ;
  47. }

1116 Come on! Let's C

模拟。

  1. // 1116 Come on! Let's C
  2. #include <map>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. map<int, int> Rank;
  7.  
  8. bool check(int x) {
  9. if(x < ) return false;
  10. for(int i = ; i * i <= x; i++) {
  11. if(x % i == ) return false;
  12. }
  13. return true;
  14. }
  15.  
  16. int main() {
  17. int n, k;
  18. cin >> n;
  19. for (int i = ; i <= n; i++) {
  20. cin >> k;
  21. Rank[k] = i;
  22. }
  23. cin >> n;
  24. while (n--) {
  25. cin >> k;
  26. printf("%04d: ", k);
  27. if(Rank[k] == -) cout << "Checked" << endl;
  28. else if(Rank[k] == ) cout << "Are you kidding?" << endl;
  29. else if(Rank[k] == ) cout << "Mystery Award" << endl, Rank[k] = -;
  30. else if(check(Rank[k])) cout << "Minion" << endl, Rank[k] = -;
  31. else cout << "Chocolate" << endl, Rank[k] = -;
  32. }
  33. return ;
  34. }

1117 Eddington Number

前缀和

  1. // 1117 Eddington Number
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int N = 1e6 + ;
  7. int d[N];
  8.  
  9. int main() {
  10. int n, k, ans = ;
  11. cin >> n;
  12. for(int i = ; i <= n; i++) {
  13. cin >> k;
  14. d[k]++;
  15. }
  16. for(int i = ; i < N; i++) d[i] += d[i - ];
  17. for(int i = ; i < N; i++) {
  18. if((n - d[i]) >= i) ans = max(ans, i);
  19. }
  20. cout << ans << endl;
  21. return ;
  22. }

1118 Birds in Forest

并查集

  1. // 1118 Birds in Forest
  2. #include <cstdio>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. const int N = 1e4 + ;
  7. bool vis[N];
  8. int fa[N], cnt = ;
  9. vector <int> birds;
  10.  
  11. int fi(int x) {
  12. return x == fa[x] ? x : fa[x] = fi(fa[x]);
  13. }
  14.  
  15. void Union(int x, int y) {
  16. int fx = fi(x), fy = fi(y);
  17. if(fx != fy) {
  18. fa[fx] = fy;
  19. }
  20. }
  21.  
  22. void init() {
  23. for (int i = ; i < N; i++) fa[i] = i;
  24. }
  25.  
  26. int main() {
  27. init();
  28. int m, n, k, u, v;
  29. scanf("%d", &n);
  30. while (n--) {
  31. scanf("%d", &k);
  32. for (int i = ; i <= k; i++) {
  33. scanf("%d", &v);
  34. if(!vis[v]) vis[v] = , birds.push_back(v);
  35. if(i == ) u = v;
  36. else Union(u, v);
  37. }
  38. }
  39. for (int i = ; i < birds.size(); i++) {
  40. u = birds[i];
  41. if(fa[u] == u) cnt++;
  42. }
  43. printf("%d %d\n", cnt, birds.size());
  44. scanf("%d", &m);
  45. while (m--) {
  46. scanf("%d %d", &u, &v);
  47. if(fi(u) == fi(v)) printf("Yes\n");
  48. else printf("No\n");
  49. }
  50. return ;
  51. }

1119 Pre- and Post-order Traversals 

通过前序和后序先建棵树。(题目中说明可以随意建棵符合的树)再中序遍历即可。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn=;
  5. int preOrder[maxn], postOrder[maxn];
  6. bool isUnique=true;
  7.  
  8. struct Node{
  9. int left=-,right=-;
  10. }node[maxn];
  11.  
  12. void build(int preL,int preR,int postL,int postR){
  13. if(preL>=preR){
  14. return;
  15. }
  16. int fa=preL;
  17. int val=preOrder[preL+];
  18. int postIdx;
  19. for(int i=postL;i<postR;i++){
  20. if(val==postOrder[i]){
  21. postIdx=i;
  22. break;
  23. }
  24. }
  25. int num=postIdx-postL;
  26. if(preR-preL-==num){
  27. isUnique=false;
  28. }
  29. node[fa].left=preL+;
  30. build(preL+,preL+num+,postL,postIdx);
  31. if(preR-preL->num){
  32. node[fa].right=preL+num+;
  33. build(preL+num+,preR,postIdx+,postR-);
  34. }
  35. }
  36.  
  37. bool first=true;
  38.  
  39. void inOrder(int root){
  40. if(root==-){
  41. return;
  42. }
  43. inOrder(node[root].left);
  44. if(first){
  45. first=false;
  46. printf("%d",preOrder[root]);
  47. }
  48. else
  49. printf(" %d",preOrder[root]);
  50. inOrder(node[root].right);
  51. }
  52.  
  53. int main(){
  54. int n;
  55. scanf("%d",&n);
  56. for(int i=;i<=n;i++) scanf("%d",&preOrder[i]);
  57. for(int i=;i<=n;i++) scanf("%d",&postOrder[i]);
  58. build(,n,,n);
  59. if(isUnique) printf("Yes\n");
  60. else printf("No\n");
  61. inOrder();
  62. printf("\n");
  63. return ;
  64. }

1120 Friend Numbers

模拟

  1. // 1120 Friend Numbers
  2. #include <set>
  3. #include <cstdio>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. const int N = 1e4 + ;
  8. int a[N], b[N];
  9.  
  10. int cal(int x) {
  11. int sum1 = ;
  12. while (x) {
  13. sum1 += x % ;
  14. x /= ;
  15. }
  16. return sum1;
  17. }
  18.  
  19. int check(int x, int y) {
  20. if (x == y) return x;
  21. return ;
  22. }
  23.  
  24. set<int> ans;
  25.  
  26. int main() {
  27. int n;
  28. bool f = ;
  29. scanf("%d", &n);
  30. for (int i = ; i <= n; i++) scanf("%d", &a[i]), b[i] = cal(a[i]);
  31. for (int i = ; i <= n; i++) {
  32. for (int j = i; j <= n; j++) {
  33. int val = check(b[i], b[j]);
  34. if (val) ans.insert(val);
  35. }
  36. }
  37. printf("%d\n", ans.size());
  38. for (auto x : ans) {
  39. if (!f) f = ;
  40. else printf(" ");
  41. printf("%d", x);
  42. }
  43. return ;
  44. }

1121 Damn Single

模拟

  1. // 1121 Damn Single
  2. #include <map>
  3. #include <vector>
  4. #include <cstdio>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. map<int, int> m, vis;
  10. vector<int> p;
  11. const int N = 1e4 + ;
  12. int a[N];
  13.  
  14. int main() {
  15. int n, x, y;
  16. scanf("%d", &n);
  17. while (n--) {
  18. scanf("%d %d", &x, &y);
  19. x++; y++;
  20. m[x] = y;
  21. m[y] = x;
  22. }
  23. scanf("%d", &n);
  24. for (int i = ; i <= n; i++) {
  25. scanf("%d", &a[i]);
  26. a[i]++;
  27. vis[a[i]] = ;
  28. }
  29. for (int i = ; i <= n; i++) {
  30. if (vis[ m[a[i]] ]) continue;
  31. p.push_back(a[i]);
  32. }
  33. sort(p.begin(), p.end());
  34. printf("%d\n", p.size());
  35. for (int i = ; i < p.size(); i++) {
  36. if (i != ) printf(" ");
  37. printf("%05d", p[i] - );
  38. }
  39. return ;
  40. }

1122 Hamiltonian Cycle

模拟

  1. // 1122 Hamiltonian Cycle
  2. #include <set>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. const int N = ;
  10. int MAP[N][N];
  11. set<int> s;
  12.  
  13. int main() {
  14. memset(MAP, -, sizeof(MAP));
  15. int n, m, k;
  16. scanf("%d %d", &n, &m);
  17. for (int i = ; i <= m; i++) {
  18. int u, v;
  19. scanf("%d %d", &u, &v);
  20. MAP[u][v] = ; MAP[v][u] = ;
  21. }
  22. scanf("%d", &k);
  23. while (k--) {
  24. bool f = ;
  25. int u, v, root;
  26. scanf("%d", &m);
  27. scanf("%d", &root);
  28. s.insert(root);
  29. u = root;
  30. for (int i = ; i < m; i++) {
  31. scanf("%d", &v);
  32. s.insert(v);
  33. if (MAP[u][v] == -) f = ;
  34. u = v;
  35. }
  36. if (root != u || s.size() != n || m != n + ) f = ;
  37. if (!f) printf("NO\n");
  38. else printf("YES\n");
  39. s.clear();
  40. }
  41. return ;
  42. }

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

  1. PAT 甲级真题题解(1-62)

    准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format  模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...

  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. AngularJS 截取字符串

    参考文章:https://blog.csdn.net/u010234516/article/details/54631525 //过滤器 app.filter('textLengthSet', fun ...

  2. sql 修改、更新、替换 某个字段的部分内容(转载)

    来源:https://blog.csdn.net/jiangnanqbey/article/details/81304834 1*.需求 将表(Ws_FormMain)的字段(order_Number ...

  3. Hibernate框架_搭建第一个Hibernate框架

    一.eclipse搭建 A.创建动态web项目 New-->Dynamic web project(web project) B.导入jar包 1.数据库驱动包 2.hibernate开发必须j ...

  4. phpstorm本地怎么上传到服务器

    连接服务器 菜单栏找到[工具/Tools]->[Deployment/部署]->[Confinguration…/配置…]. 点加号(+),添加一台服务器,填写名称,选择类型为SFTP,点 ...

  5. 用Python写一个贪吃蛇

    最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法. 由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这 ...

  6. typescript中类的继承

    typescript中类的继承用到的是:extends和super 先看一下typescript中类的写法: class Demo{ //类的属性 name:string; age:number; / ...

  7. mssql sqlserver updatetext关键字应用简介说明

    摘要: 下文讲述updatetext的功能及举例说明 实验环境:sql server 2008 R2 updatetext关键字功能及语法说明 updatetext功能说明: updatetext的功 ...

  8. MySQL基础知识-安装MySQL

    前导: 昨天去参加了一个面试,公司不太大,是一家日资企业,在国内有几家分公司,面试官问到了MySQL的基本操作和性能优化,说了一大堆,倒是比较轻松的过了,但是面试结束之后,想了一下,基本操作忘的还是挺 ...

  9. Windows服务器如何查看共享目录信息

    查看Windows服务器上的共享目录的相关信息,可以使用两种方式: 1:命令net share 查看: 2:通过计算机管理的Shared Folders查看

  10. jquery中Json操作

    在开发中,我们有可能拿到的不是全的json,而是一部分json格式的数据,这个时候我们需要将其强转为json对象 第一种方法:使用jquery中的$.parseJSON(),但是它对json数据格式的 ...