当前位置:   article > 正文

PAT (Advanced Level) Practice_pat (advanced level) practice什么意思

pat (advanced level) practice什么意思

 

 

 

1001:A+B Format (20 分)(AC:stack)

注意要点:

1.注意0的时候的问题。

  1. #include<iostream>
  2. #include<stack>
  3. using namespace std;
  4. stack<char> s;
  5. int main(){
  6. int a , b , count = 0 , n = 0;
  7. scanf("%d %d" , &a , &b);
  8. int t = a + b;
  9. //全是对于t的正数操作//
  10. if(t < 0){
  11. t = -t;
  12. }
  13. //对于 t 的处理//
  14. while(t != 0){
  15. char c = t % 10 + '0';
  16. s.push(c);
  17. count ++;
  18. if(count == 3){
  19. s.push(',');
  20. count =0;
  21. }
  22. t /= 10;
  23. }
  24. //判断正负//
  25. if(a + b < 0){
  26. printf("-");
  27. }
  28. if(a + b == 0){
  29. printf("0");
  30. return 0;
  31. }
  32. //输出//
  33. while(!s.empty()){
  34. if(n == 0 && s.top() == ','){
  35. s.pop();
  36. n ++;
  37. continue;
  38. }
  39. printf("%c" , s.top());
  40. s.pop();
  41. n ++;
  42. }
  43. return 0;
  44. }

 

1002:A+B for Polynomials (25)(AC)

注意要点:

1.float数组类型初始化的时候切记内部数字也得是0.0,要不然真的死都不知道怎么死的。

2.多组数据只要是后面不用的,都可以共用一个。

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int M;
  5. int a;
  6. float b;
  7. int num = 0;
  8. float p[1005] = {0.0} ; //注意这个地方//
  9. scanf("%d" , &M);
  10. //第一行//
  11. for(int i = 0 ; i < M ; i ++) {
  12. scanf("%d %f" , &a , &b);
  13. p[a] += b ;
  14. }
  15. //第二行//
  16. getchar();
  17. scanf("%d" , &M);//可以直接覆盖//
  18. for(int i = 0 ; i < M ; i ++) {
  19. scanf("%d %f" , &a , &b);
  20. p[a] += b; //在第一行基础之上往上加//
  21. }
  22. //统计个数//
  23. for(int i = 0 ; i < 1005 ; i ++){
  24. if(p[i] != 0) num ++;
  25. }
  26. printf("%d" , num);
  27. for(int i = 10 ; i >= 0 ; i --){
  28. if(p[i] != 0)
  29. printf(" %d %.1f" , i , p[i]);
  30. }
  31. return 0;
  32. }

 

1003:Emergency (25 分)(AC)

注意要点:

1.Dijkstra + BFS

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. const int MAXV = 505;
  6. const int INF = 1000000;
  7. int G[MAXV][MAXV] , num[MAXV] , w[MAXV] , d[MAXV] , weight[MAXV];
  8. int N , M , S , D;
  9. bool vis[MAXV] = { 0 };
  10. void Dijkstra(int S){
  11. //初始化//
  12. fill(d , d + MAXV , INF);
  13. memset(w , 0 , sizeof(w));
  14. memset(num , 0 , sizeof(num));
  15. //开始各种标记//
  16. d[S] = 0;
  17. w[S] = weight[S];
  18. num[S] = 1;
  19. //遍历每个点//
  20. for(int i = 0 ; i < N ; i ++) {
  21. //找到d之中最小的//
  22. int u = -1 , MIN = INF;
  23. for(int j = 0 ; j < N ; j ++){
  24. if(vis[j] == false && d[j] < MIN){
  25. u = j;
  26. MIN = d[j];
  27. }
  28. }
  29. //特殊情况找不到,退出//
  30. if(u == -1) return ;
  31. vis[u] = true;
  32. //修改值//
  33. for(int v = 0 ; v < N ; v ++) {
  34. if(vis[v] == false && G[u][v] != INF){
  35. if(d[u] + G[u][v] < d[v]){
  36. d[v] = d[u] + G[u][v];
  37. w[v] = w[u] + weight[v];
  38. num[v] = num[u];
  39. }
  40. else if(d[u] + G[u][v] == d[v]){
  41. if(w[u] + weight[v] > w[v])
  42. w[v] = w[u] + weight[v];
  43. num[v] += num[u];
  44. }
  45. }
  46. }
  47. }
  48. }
  49. int main() {
  50. int a , b , c;
  51. scanf("%d %d %d %d" , &N , &M , &S , &D);
  52. for(int i = 0 ; i < N ; i ++) {
  53. scanf("%d" , &weight[i]);//救援队既是权值//
  54. }
  55. fill(G[0] , G[0] + MAXV * MAXV , INF);
  56. for(int i = 0 ; i < M ; i ++) {
  57. scanf("%d %d %d" , &a , &b , &c);
  58. G[a][b] = c;
  59. G[b][a] = c;
  60. }
  61. Dijkstra(S);
  62. printf("%d %d\n" , num[D] , w[D]);
  63. return 0;
  64. }

 

1004:Counting Leaves (30 分)(AC:DFS)

注意要点:

1.一开始的思路是去建立一棵树,想了想发现DFS也可以做出来。

2.强化DFS问题解决方式:递归 + 边界判断。 

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. const int MAXN = 105;
  5. vector<int> v[MAXN];
  6. int J[MAXN];
  7. int D = -1;
  8. void DFS(int x , int depth){
  9. //边界//
  10. if(v[x].size() == 0){
  11. J[depth] ++;
  12. D = max(depth , D);
  13. return ;
  14. }
  15. //递归//
  16. for(int i = 0 ; i < v[x].size() ; i ++){
  17. DFS(v[x][i] , depth + 1);
  18. }
  19. }
  20. int main(){
  21. int N , M , ID , K , a;
  22. //输入//
  23. scanf("%d %d" , &N , &M);
  24. for(int i = 0 ; i < M ; i ++){
  25. scanf("%d %d" , &ID , &K);
  26. for(int j = 0 ; j < K ; j ++){
  27. scanf("%d" , &a);
  28. v[ID].push_back(a);
  29. }
  30. }
  31. //DFS//
  32. DFS(1 , 0);
  33. //输出//
  34. for(int i = 0 ; i <= D ; i ++){
  35. if(i == 0){
  36. printf("%d" , J[i]);
  37. }
  38. else{
  39. printf(" %d" , J[i]);
  40. }
  41. }
  42. return 0;
  43. }

 

1005:Spell It Right (20 分)(AC:Vector)

注意要点:

1.0的情况考虑一下。

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. vector<int> v;
  5. int main(){
  6. int sum = 0 ;
  7. char a;
  8. char b[10][10] = {"zero" , "one" , "two" , "three" , "four" , "five" , "six" , "seven" , "eight" , "nine"};
  9. //输入//
  10. while(scanf("%c" , &a) == 1){
  11. if(a != '\n')
  12. sum =sum + (a - '0');
  13. }
  14. //倒着插入//
  15. if(sum == 0){
  16. printf("zero");
  17. }
  18. else{
  19. while(sum != 0){
  20. int c = sum % 10;
  21. v.push_back(c);
  22. sum /= 10;
  23. }
  24. //输出//
  25. for(int i = v.size() - 1 ; i >= 0 ; i --){
  26. if(i == v.size() - 1){
  27. printf("%s" , b[v[i]]);
  28. }
  29. else{
  30. printf(" %s" , b[v[i]]);
  31. }
  32. }
  33. }
  34. return 0;
  35. }

 

1007:Maximum Subsequence Sum (DP)

掌握了一个基本的dp问题的思路。

先写边界,随后确定递推公式。基本的模型一定要先理解清楚,随后做题才能在此基础之上进一步求解。

  1. #include<iostream>
  2. using namespace std;
  3. const int MAXN = 10005;
  4. int main(){
  5. int K;
  6. int a[MAXN] , dp[MAXN];//dp的含义是指,在这个数值状态下的最大的数值是多少//
  7. int s[MAXN] = { 0 };
  8. bool flag = true;
  9. scanf("%d" , &K);
  10. for(int i = 0 ; i < K ; i ++){
  11. scanf("%d" , &a[i]);
  12. if(a[i] >= 0){
  13. flag = false;
  14. }
  15. }
  16. if(flag == true){//如果有一个数字是负数的话,则直接输出//
  17. printf("%d %d %d" , 0 , a[0] , a[K - 1]);
  18. return 0;
  19. }
  20. dp[0] = a[0];//第一个数值就是其本身//
  21. for(int i = 1 ; i < K ; i ++){
  22. if(dp[i - 1] + a[i] > a[i]){ //
  23. dp[i] = dp[i - 1] + a[i];
  24. s[i] = s[i - 1];
  25. }
  26. else{
  27. dp[i] = a[i];
  28. s[i] = i;
  29. }
  30. }
  31. int n = 0;
  32. for(int i = 1 ; i < K ; i ++){
  33. if(dp[i] > dp[n]){
  34. n = i;
  35. }
  36. }
  37. printf("%d %d %d\n" , dp[n] , a[s[n]] , a[n]);
  38. return 0;
  39. }

 

1008:Elevator (20 分)(AC:vector数学问题)

注意要点:

无。

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. vector<int> v;
  5. int main(){
  6. int N , a , d = 0;
  7. //输入//
  8. scanf("%d" , &N);
  9. for(int i = 0 ; i < N ; i ++){
  10. scanf("%d" , &a);
  11. v.push_back(a);
  12. }
  13. //层数操作//
  14. for(int i = 0 ; i < v.size() ; i ++){
  15. //一层//
  16. if(i == 0){
  17. d = d + (v[i] - 0) * 6 + 5;
  18. }
  19. //二层以上 , 比你高//
  20. else if( i != 0 && (v[i] > v[i - 1])){
  21. d = d + ((v[i] - v[i - 1]) * 6 + 5);
  22. }
  23. // 二层以上,比你低//
  24. else{
  25. d = d + ((v[i - 1] - v[i]) * 4 + 5);
  26. }
  27. }
  28. printf("%d" , d);
  29. return 0;
  30. }

 

1009:Product of Polynomials (25 分)(AC:数学模拟)

注意要点:

1.审题,注意这个题目是要求乘法,我一开始做成加法了, 浪费了很多时间。

2.double类型只能由lf来接,否则都是根本接不到。

3.这个题思路也是很清晰,几乎不用拐弯,我开了两个数组的原因是不想交叉起来不好修改。

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. int N , M , a , c , maxn = -1 , count = 0;
  5. double b , d;
  6. double A[10000] = { 0 } , B[10000] = { 0 };
  7. //输入//
  8. scanf("%d" , &N);
  9. for(int i = 0 ; i < N ; i ++){
  10. scanf("%d %lf" , &a , &b);
  11. A[a] = A[a] + b;
  12. //边界//
  13. if(a > maxn){
  14. maxn = a;
  15. }
  16. }
  17. scanf("%d" , &M);
  18. for(int j = 0 ; j < M ; j ++){
  19. scanf("%d %lf" , &c , &d);
  20. //换到B数组里面//
  21. for(int i = maxn ; i >= 0 ; i --){
  22. if(A[i] != 0){
  23. B[i + c] = B[i + c] + d * A[i];
  24. if(i + c > maxn){
  25. maxn = i + c;
  26. }
  27. }
  28. }
  29. }
  30. for(int i = 0 ; i <= maxn ; i ++){
  31. if(B[i] != 0){
  32. count ++;
  33. }
  34. }
  35. //输出//
  36. printf("%d " , count);
  37. for(int i = maxn ; i >= 0 ; i --){
  38. if(B[i] != 0.0){
  39. printf("%d %.1lf" , i , B[i]);
  40. count --;
  41. if(count > 0)
  42. printf(" ");
  43. }
  44. }
  45. return 0;
  46. }

 

1011:World Cup Betting (20 分)(AC:数学模拟)

注意要点:

1.这个输出着实牛啤,还能这么输出。

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. float a, sum = 1 ;
  5. int k;
  6. char S[3] = {'W' , 'T' , 'L'};//对应字符表//
  7. //输入//
  8. for(int i = 0 ; i < 3 ; i ++){
  9. float max = -1.0 ;
  10. for(int j = 0 ; j < 3 ; j ++){
  11. scanf("%f" , &a);
  12. if(a > max){
  13. max = a;
  14. k = j;
  15. }
  16. }
  17. printf("%c " , S[k]);
  18. sum *= max;
  19. }
  20. //输出2//
  21. printf("%.2f" , (sum * 0.65 - 1) * 2);
  22. return 0;
  23. }

 

1013:Battle Over Cities (25 分)(AC :DFS , 并查集)

注意要点:

1.dfs之后改用连接表,不要使用图了。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<vector>
  5. using namespace std;
  6. const int INF = 10000000;
  7. vector<int> v[1005];
  8. int c;
  9. bool vis[1005];
  10. void dfs(int e){
  11. if(e == c) return ;
  12. vis[e] = true;
  13. for(int i = 0 ; i < v[e].size() ; i ++){
  14. if(vis[v[e][i]]== false){
  15. dfs(v[e][i]);
  16. }
  17. }
  18. }
  19. int main(){
  20. int N , M , K ,a , b;
  21. //输入//
  22. scanf("%d %d %d" , &N , &M , &K);
  23. for(int i = 0 ; i < M ; i ++){
  24. scanf("%d %d" , &a , &b);
  25. v[a].push_back(b);
  26. v[b].push_back(a);
  27. }
  28. //输出//
  29. for(int i = 0 ; i < K ; i ++){
  30. scanf("%d" , &c);
  31. memset(vis , false , sizeof(vis));
  32. int block = 0;
  33. for(int i = 1 ; i <= N ; i ++){
  34. if(i != c && vis[i] == false){
  35. dfs(i);
  36. block ++;
  37. }
  38. }
  39. printf("%d\n" , block - 1);
  40. }
  41. return 0;
  42. }

 

1020:Tree Traversals (25 分)(AC)

注意要点:

2.这个层序遍历的这个地方非常容易错,修改了两三次才AC了。

  1. #include<iostream>
  2. #include<queue>
  3. using namespace std;
  4. struct node{
  5. int data;
  6. node* lchild;
  7. node* rchild;
  8. };
  9. int pos[55] , in[55];
  10. int N;
  11. //利用后根数列和中根数列求原来的数列//
  12. node* creat(int posL , int posR , int inL , int inR) {
  13. //边界//
  14. if(posL > posR){
  15. return NULL;
  16. }
  17. //求根节点//
  18. node* root = new node;
  19. root->data = pos[posR];
  20. int k;
  21. for(k = inL ; k <= inR ; k ++) {
  22. if(in[k] == pos[posR])
  23. break;
  24. }
  25. //左右分支//
  26. int numleft = k - inL;
  27. root->lchild = creat(posL , posL + numleft - 1 , inL , k - 1);//易错//
  28. root->rchild = creat(posL + numleft , posR - 1, k + 1 , inR);
  29. return root;
  30. }
  31. //利用BFS来输出这个层序遍历。//
  32. int num = 0 ;
  33. void BFS(node* root) {
  34. queue<node*> q;
  35. q.push(root);
  36. while(!q.empty()){
  37. node* t = q.front();
  38. q.pop();
  39. printf("%d" , t->data);
  40. num ++;
  41. if(num < N) printf(" ");
  42. if(t->lchild != NULL) q.push(t->lchild);
  43. if(t->rchild != NULL) q.push(t->rchild);
  44. }
  45. }
  46. int main() {
  47. scanf("%d" , &N);
  48. for(int i = 0 ; i < N ; i ++) {
  49. scanf("%d" , &pos[i]);
  50. }
  51. for(int i = 0 ; i < N ; i ++) {
  52. scanf("%d" , &in[i]);
  53. }
  54. node* root = creat(0 , N - 1 , 0 , N - 1);
  55. BFS(root);
  56. return 0;
  57. }

 

1030:Travel Plan (30 分)(AC:Dijkstra第二形态 + 记忆化DFS)

注意要点:

1.这个地方注意这是个无向图。需要注意来回的数值都可以。

2.巧了,不知道为什么PTA的数值题目都可以用 Matrix 来做。看来数据还是小。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. const int MAXN = 505;
  6. const int INF = 100005;
  7. //初始化定义//
  8. int G[MAXN][MAXN];
  9. int cost[MAXN][MAXN];
  10. int d[MAXN] , x[MAXN];
  11. int pre[MAXN];
  12. bool vis[MAXN];
  13. int N , M , S , D;
  14. int a , b , c , de;
  15. void Dijkstra(int s){
  16. fill(d , d + MAXN , INF);
  17. fill(x , x + MAXN , INF);
  18. //Ñ°ÕÒÇ°Çý½áµã//
  19. for(int i = 0 ; i < N ; i ++){
  20. pre[i] = i;
  21. }
  22. d[s] = 0;
  23. x[s] = 0;
  24. for(int i = 0 ; i < N ; i ++){
  25. int u = -1 , MIN = INF;
  26. //第一步:找最小值//
  27. for(int j = 0 ; j < N ; j ++){
  28. if(vis[j] == false && d[j] < MIN){
  29. MIN = d[j];
  30. u = j;
  31. }
  32. }
  33. //第二步:确定范围//
  34. if(u == -1) return ;
  35. //第三步:更新数值//
  36. vis[u] = true;
  37. for(int v = 0 ; v < N ; v ++){
  38. if(vis[v] == false && G[u][v] != INF){
  39. if(d[u] + G[u][v] < d[v]){
  40. d[v] = d[u] + G[u][v];
  41. x[v] = x[u] + cost[u][v];
  42. pre[v] = u;
  43. }
  44. else if(d[u] + G[u][v] == d[v]){
  45. if(x[u] + cost[u][v] < x[v]){
  46. x[v] = x[u] + cost[u][v];
  47. pre[v] = u;
  48. }
  49. }
  50. }
  51. }
  52. }
  53. }
  54. //记忆化搜索//
  55. void DFS(int v){
  56. if(v == S){
  57. printf("%d " , S);
  58. return ;
  59. }
  60. DFS(pre[v]);
  61. printf("%d " , v);
  62. }
  63. int main(){
  64. //初始化数据//
  65. fill(d , d + MAXN , false);
  66. fill(G[0] , G[0] + MAXN * MAXN , INF);
  67. //ÊäÈë//
  68. scanf("%d %d %d %d" , &N , &M , &S , &D);
  69. for(int i = 0 ; i < M ; i ++){
  70. scanf("%d %d %d %d" , &a , &b , &c , &de);
  71. G[a][b] = c;
  72. G[b][a] = c;
  73. cost[a][b] = de;
  74. cost[b][a] = de;
  75. }
  76. //最短路径//
  77. Dijkstra(S);
  78. //输出//
  79. DFS(D);
  80. printf("%d %d\n" , d[D] , x[D]);
  81. }

 

1031:Hello World for U (20 分)(AC:打印图案)

思路提示:

1.首先需要确定n1 , n2 , n3的数值,其次按照边框再每一个打印出来,最后二维数组写出。

注意要点:

1.最后强调一次这个memset这个功能。在cstring头文件下。

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main(){
  5. char s[100];
  6. char m[100][100];
  7. memset(m , ' ' , sizeof(m));
  8. scanf("%s" , s);
  9. //确定n1 , n2 , n3 //
  10. int len = strlen(s) + 2;
  11. int n1 = len / 3;
  12. int n3 = n1;
  13. int n2 = len / 3 + len % 3;
  14. //填入数组中//
  15. int k = 0 ;
  16. for(int i = 0; i < n1 ; i ++){//n1//
  17. m[i][0] = s[k ++];
  18. }
  19. for(int i = 1 ; i <= n2 - 2 ; i ++){//n2//
  20. m[n1 - 1][i] = s[k ++];
  21. }
  22. for(int i = n3 - 1 ; i >= 0 ; i --){//n3//
  23. m[i][n2 - 1] = s[k ++];
  24. }
  25. //输出//
  26. for(int i = 0 ; i < n1 ; i ++){
  27. for(int j = 0 ; j < n2 ; j ++){
  28. printf("%c" , m[i][j]);
  29. }
  30. printf("\n");
  31. }
  32. return 0;
  33. }

 

1033:Sharing (25 分)(AC:模拟链表)

思路提示:

1.模拟链表的技巧。

注意要点:

%05d,超容易犯错。

  1. #include<iostream>
  2. const int MAXN = 100005;
  3. using namespace std;
  4. struct node{
  5. char data;
  6. int next;
  7. }Node[MAXN];
  8. int main(){
  9. int s1 , s2 , n , a , c , k = 0;
  10. char b;
  11. bool L[MAXN] = { false };
  12. //输入//
  13. scanf("%d %d %d" , &s1 , &s2 , &n);
  14. for(int i = 0 ; i < n ; i ++){
  15. scanf("%d %c %d" , &a , &b , &c);
  16. Node[a].data = b;
  17. Node[a].next = c;
  18. }
  19. //第一轮//
  20. int root = s1;
  21. while(root != -1){
  22. L[root] = true;
  23. root = Node[root].next;
  24. }
  25. L[root] = true;
  26. //第二轮:找交点//
  27. int root2 = s2;
  28. while(root2 != -1){
  29. if(L[root2] == true){
  30. printf("%05d" , root2);
  31. L[root2] = false;//防止下次判断//
  32. break;
  33. }
  34. root2 = Node[root2].next;
  35. }
  36. if(L[root2] == true)
  37. printf("-1");
  38. return 0;
  39. }

 

1035:Password (20 分)(AC::水题)

思路提示:请认真读题。

注意要点:

1.这个地方注意这个多数和单一的情况。

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. struct A{
  5. string b;//第一个字符串//
  6. string c;//第二个字符串//
  7. bool flag;//判断这个是否修改过//
  8. }a[1005];
  9. int main(){
  10. int n , count = 0;
  11. scanf("%d" , &n);
  12. for(int i = 0 ; i < n ; i ++){
  13. cin >> a[i].b >> a[i].c;
  14. for(int j = 0 ; j < a[i].c.size() ; j ++){//不停的进行修改保存//
  15. if(a[i].c[j] == '1'){
  16. a[i].c[j] = '@';
  17. a[i].flag = 1;
  18. continue;
  19. }
  20. if(a[i].c[j] == '0'){
  21. a[i].c[j] = '%';
  22. a[i].flag = 1;
  23. continue;
  24. }
  25. if(a[i].c[j] == 'l'){
  26. a[i].c[j] = 'L';
  27. a[i].flag = 1;
  28. continue;
  29. }
  30. if(a[i].c[j] == 'O'){
  31. a[i].c[j] = 'o';
  32. a[i].flag = 1;
  33. continue;
  34. }
  35. }
  36. if(a[i].flag == 1){
  37. count ++;//有问题个数的统计//
  38. }
  39. }
  40. //输出//
  41. if(n == 1 && count == 0){//1的情况//
  42. printf("There is 1 account and no account is modified");
  43. }
  44. else if(count == 0){//多数的情况//
  45. printf("There are %d accounts and no account is modified" , n);
  46. }
  47. else{//输出错误的情况//
  48. printf("%d\n" , count);
  49. for(int i = 0 ; i < n ; i ++){
  50. if(a[i].flag == 1){
  51. cout << a[i].b << " " << a[i].c;
  52. count --;
  53. if(count != 0){
  54. printf("\n");
  55. }
  56. }
  57. }
  58. }
  59. return 0;
  60. }

 

1036:Boys vs Girls (25 分)(AC :水题)

注意要点:注意读题,缺的地方写Absent。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<math.h>
  4. using namespace std;
  5. int main(){
  6. int n , maxm = 10000 , maxn = -1 ;
  7. string maxmID , maxmname , maxnID , maxnname;
  8. scanf("%d" , &n);
  9. for(int i = 0 ; i < n ; i ++){
  10. int number;
  11. char sex ;
  12. string ID , name;
  13. cin >> name >> sex >> ID >> number;
  14. if(sex == 'M' && maxm > number){//成绩为男性//
  15. maxmname = name;
  16. maxmID = ID;
  17. maxm = number;
  18. }
  19. if(sex == 'F' && maxn < number){//成绩为女性//
  20. maxnname = name;
  21. maxnID = ID;
  22. maxn = number;
  23. }
  24. }
  25. //输出//
  26. if(maxm == 10000 || maxn == -1){//缺一个//
  27. if(maxm == 10000)
  28. cout << maxnname << " " << maxnID << endl << "Absent" << endl << "NA";
  29. if(maxn == -1)
  30. cout << "Absent" << endl << maxmname << " " << maxmID << endl << "NA";
  31. }
  32. else{//全有//
  33. cout << maxnname << " " << maxnID << endl;
  34. cout << maxmname << " " << maxmID << endl;
  35. printf("%d" , abs(maxn - maxm));
  36. }
  37. return 0;
  38. }

 

1040:Longest Symmetric String (25 分)(AC:DP)

注意要点:控制每次移动的长度,从1-3。

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int dp[1005][1005];
  5. int main(){
  6. string s;//注意小写string//
  7. int ans = 1;
  8. getline(cin , s);//专用空格//
  9. int len = s.size();
  10. memset(dp , 0 , sizeof(dp));//长度为 1和 2 的情况//
  11. for(int i = 0 ; i < len ; i ++){
  12. dp[i][i] = 1;
  13. if(i < len - 1){
  14. if(s[i] == s[i + 1]){
  15. dp[i][i + 1] = 1;
  16. ans = 2;
  17. }
  18. }
  19. }
  20. //处理数据长度为3//
  21. for(int L = 3 ; L <= len ; L ++){
  22. for(int i = 0 ; i + L - 1 < len ; i ++){
  23. int j = i + L - 1;//记录末尾值//
  24. if(s[i] == s[j] && dp[i + 1][j - 1] == 1){
  25. dp[i][j] = 1;
  26. ans = L;
  27. }
  28. }
  29. }
  30. printf("%d" , ans);
  31. return 0;
  32. }

 

1043:Is It a Binary Search Tree (25 分)(AC)

注意要点:

这个题目非常好,典型的二叉搜索树的体现。操作类似于树的操作。

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. struct node{
  5. int data;
  6. node *left;
  7. node *right;
  8. };
  9. void insert(node* &root , int a) {
  10. if(root == NULL){
  11. root = new node;
  12. root->data = a;
  13. root->left = NULL;
  14. root->right = NULL;
  15. return ;
  16. }
  17. if(a < root->data) insert(root->left , a);
  18. else insert(root->right , a);
  19. }
  20. void preorder(node* root , vector<int>&v){
  21. if(root == NULL){
  22. return ;
  23. }
  24. v.push_back(root->data);
  25. preorder(root->left , v);
  26. preorder(root->right , v);
  27. }
  28. void preorderM(node* root , vector<int>&v){
  29. if(root == NULL){
  30. return ;
  31. }
  32. v.push_back(root->data);
  33. preorderM(root->right , v);
  34. preorderM(root->left , v);
  35. }
  36. void postorder(node* root , vector<int>&v){
  37. if(root == NULL){
  38. return ;
  39. }
  40. postorder(root->left , v);
  41. postorder(root->right , v);
  42. v.push_back(root->data);
  43. }
  44. void postorderM(node* root , vector<int>&v){
  45. if(root == NULL){
  46. return ;
  47. }
  48. postorderM(root->right , v);
  49. postorderM(root->left , v);
  50. v.push_back(root->data);
  51. }
  52. vector<int>origin , pre , preM , post , postM;//初始, 前序 , 后序 , 平衡前序 , 平衡后序//
  53. int main() {
  54. int N , a;
  55. node *root = NULL;
  56. //输入//
  57. scanf("%d" , &N);
  58. for(int i = 0 ; i < N ; i ++) {
  59. scanf("%d" , &a);
  60. origin.push_back(a);
  61. insert(root , a);
  62. }
  63. //前序//
  64. preorder(root , pre);
  65. //镜像前序//
  66. preorderM(root , preM);
  67. //后序//
  68. postorder(root , post);
  69. //镜像后序//
  70. postorderM(root , postM);
  71. if(origin == pre){
  72. printf("YES\n");
  73. for(int i = 0 ; i < post.size() ; i ++) {
  74. if(i == post.size() - 1)
  75. printf("%d" , post[i]);
  76. else
  77. printf("%d " , post[i]);
  78. }
  79. }
  80. else if(origin == preM){
  81. printf("YES\n");
  82. for(int i = 0 ; i < postM.size() ; i ++) {
  83. if(i == postM.size() - 1)
  84. printf("%d" , postM[i]);
  85. else
  86. printf("%d " , postM[i]);
  87. }
  88. }
  89. else{
  90. printf("NO\n");
  91. }
  92. return 0;
  93. }


 

1045:Favorite Color Stripe(LCS)

这个题目其实LIS也是可以做的,但是我没有做。以后有时间补上。

一开始我还在想这个地方会不会有冲突出现,但是一想,LCS已经完美的解决了这个问题,关键是这个地方他有个重复的问题在里面。当前的状态如果没有匹配到的话,那就直接把前面的数值补进来。

  1. #include<iostream>
  2. using namespace std;
  3. const int MAXM = 205;
  4. const int MAXL = 10005;
  5. int a[MAXM] , b[MAXL] , dp[MAXM][MAXL];//这个要定义到外面,内部空间不够会报错.dp表示当前的最大的数值//
  6. int main(){
  7. int n , m , l;
  8. scanf("%d" , &n);
  9. scanf("%d" , &m);
  10. for(int i = 1 ; i <= m ; i ++){
  11. scanf("%d" , &a[i]);
  12. }
  13. scanf("%d" , &l);
  14. for(int i = 1 ; i <= l ; i ++){
  15. scanf("%d" , &b[i]);
  16. }
  17. //边界//
  18. for(int i = 0 ; i <= m ; i ++){
  19. dp[i][0] = 0;
  20. }
  21. for(int i = 0 ; i <= l ; i ++){
  22. dp[0][i] = 0;
  23. }
  24. //递推//
  25. for(int i = 1 ; i <= m ; i ++){
  26. for(int j = 1 ; j <= l ; j ++){
  27. if(a[i] == b[j]){
  28. dp[i][j] = max(dp[i - 1][j] , dp[i][j - 1]) + 1;
  29. }
  30. else{
  31. dp[i][j] = max(dp[i - 1][j] , dp[i][j - 1]);
  32. }
  33. }
  34. }
  35. printf("%d\n" , dp[m][l]);
  36. return 0;
  37. }

 

1047:Student List for Course(25 分)(AC)

注意要点:

1.这个地方因为不需要输入名字,所以不用hash了。

2.注意字典序的用法。

3.这个地方C的写法。二维数组换成了几个一维数组字符串。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<vector>
  4. #include<algorithm>
  5. using namespace std;
  6. char C[40005][5];
  7. vector<int> course[40005];
  8. bool cmp(int a , int b) {
  9. return strcmp(C[a] , C[b]) < 0 ;//这个地方注意字典序的排列//
  10. }
  11. int main(){
  12. int N , K;
  13. int c , d;
  14. scanf("%d %d" , &N , &K);
  15. for(int i = 0 ; i < N ; i ++) {
  16. scanf("%s %d" , C[i] , &c);
  17. for(int j = 0 ; j < c ; j ++) {
  18. scanf("%d" , &d);
  19. course[d].push_back(i);
  20. }
  21. }
  22. //输出//
  23. for(int i = 1 ; i <= K ; i ++) {
  24. printf("%d %d\n" , i , course[i].size());
  25. sort(course[i].begin() , course[i].end() , cmp);
  26. for(int j = 0 ; j < course[i].size() ; j ++) {
  27. printf("%s\n" , C[course[i][j]]);
  28. }
  29. }
  30. return 0;
  31. }

 

1053:Path of Equal Weight (30 分)(AC)

注意要点:

1.一开始这个路径这个地方需要设置开头的点为0。

2.注意每次实现完之后都要return (因为 return 的是上一级)。

3.这个地方记录一下这个path的问题。其实path本身并不是完全记录每一条的路径。他其实就是一个再覆盖。
本身的地方在于这个输出。这个输出如果对了,就打印在他前面的所有节点的数据就可以了,而他后面的数据则不用管。 

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. int N , M , S , path[105];
  6. struct node{
  7. int weight;
  8. vector<int> child;
  9. }Node[105];
  10. bool cmp(int a , int b){
  11. return Node[a].weight > Node[b].weight;
  12. }
  13. void DFS(int index , int num , int sum){
  14. if(sum > S) return ;//超了//
  15. else if(sum == S){//正好//
  16. if(Node[index].child.size()!= 0)
  17. return ;
  18. for(int i = 0 ; i < num ; i ++){
  19. if(i == num - 1)
  20. printf("%d\n" , Node[path[i]].weight);
  21. else
  22. printf("%d " , Node[path[i]].weight);
  23. }
  24. }
  25. else{//不够//
  26. for(int i = 0 ; i < Node[index].child.size() ; i ++){
  27. int c= Node[index].child[i];
  28. path[num] = c;//这个地方其实是直接覆盖的。
  29. DFS(c , num + 1 , sum + Node[c].weight);
  30. }
  31. }
  32. }
  33. int main(){
  34. scanf("%d %d %d" , &N , &M , &S);
  35. for(int i = 0 ; i < N ; i ++){
  36. scanf("%d" , &Node[i].weight);
  37. }
  38. for(int i = 0 ; i < M ; i ++){
  39. int id , num , a;
  40. scanf("%d %d" , &id , &num);
  41. for(int j = 0 ; j < num ; j ++){
  42. scanf("%d" , &a);
  43. Node[id].child.push_back(a);
  44. }
  45. sort(Node[id].child.begin() , Node[id].child.end() , cmp);
  46. }
  47. path[0] = 0;//把id放进来//
  48. DFS(0 , 1 , Node[0].weight);//起始点的位置数码 , 当前的元素的个数,当前元素的和//
  49. return 0;
  50. }

 

1063:Set Similarity(25 分)(AC)

注意要点:

1.注意输入的时候会出点问题,尽可能的分开输入的格式。

  1. #include<iostream>
  2. #include<set>
  3. using namespace std;
  4. set<int> a[55];
  5. void fun(int b , int c) {
  6. int samenum = 0 , allnum = a[c].size();
  7. for(set<int>::iterator it = a[b].begin() ; it != a[b].end() ; it ++) {
  8. if(a[c].find(*it) != a[c].end()) samenum ++;
  9. else allnum ++;
  10. }
  11. printf("%.1f%%\n" , samenum * 100.0 / allnum);
  12. }
  13. int main() {
  14. int N , n , v;
  15. int c , b;
  16. int e ;
  17. scanf("%d" , &N);
  18. for(int i = 1 ; i <= N ; i ++) {
  19. scanf("%d" , &n);
  20. for(int j = 0 ; j < n ; j ++) {
  21. scanf("%d" , &v);
  22. a[i].insert(v);
  23. }
  24. }
  25. //输入//
  26. scanf("%d" , &e);
  27. for(int i = 0 ; i < e ; i ++) {
  28. scanf("%d %d" , &b , &c);
  29. fun(b , c);
  30. }
  31. return 0;
  32. }

 

1065:A+B and C (64bit) (20)(AC)

注意要点:

1。注意 long long 的写法,范围是(2 ^ - 63 , 2 ^ 63),这个一但求和值必然会超出 long long ,只需要考虑溢出的情况即可。

2。关于溢出,这个东西就是个环形的问题 ,数字超过范围符号变化到但是数字照样加,所以会出现负数的情况。所以你也可以理解,一旦两个正数加成负数必然是溢出,到那时你c的数值必不可能会超过 long long 。与此相反,另外一面情况也可以理解了。

  1. #include<iostream>
  2. using namespace std;
  3. int main() {
  4. int N;
  5. int numcase = 1;
  6. scanf("%d" , &N);
  7. for(int i = 0 ; i < N ; i ++) {
  8. long long a , b , c;
  9. scanf("%lld%lld%lld", &a , &b , &c);
  10. long long r = a + b;
  11. bool flag ;
  12. //溢出情况检查//
  13. if(a > 0 && b > 0 && c < 0) flag = true;
  14. else if(a < 0 && b < 0 && c >= 0) flag = false;
  15. //正常情况检查//
  16. else if(r > c) flag = true;
  17. else flag = false;
  18. //输出//
  19. if(flag == true) {
  20. printf("Case #%d: true\n" , numcase ++);
  21. }
  22. else {
  23. printf("Case #%d: false\n" , numcase ++);
  24. }
  25. }
  26. return 0;
  27. }

 

1068:Find More Coins(01背包 + 记忆化搜索)

注意要点:注意01背包的含义,前i个硬币恰好有v元可以买到东西。

其次是记忆化搜索。每个状态的时候就会更新这个状态下的硬币的情况,用flag来确定每个硬币的使用情况。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. const int MAXN = 10005;
  6. const int MAXM = 105;
  7. int v[MAXN] , dp[MAXM];//dp的意思是指在前i个硬币恰好有v元能获得的价值//
  8. bool flag[MAXN] , choice[MAXN][MAXM];
  9. //在这个地方的价格和体积是一样的,所以二者合并起来了//
  10. bool cmp(int a , int b){//因为这个题目是一个01背包,倒着输出//
  11. return a > b;
  12. }
  13. int main(){
  14. memset(dp , 0 , sizeof(dp));
  15. int N , M;
  16. scanf("%d %d" , &N , &M);
  17. for(int i = 1 ; i <= N ; i ++){
  18. scanf("%d" , &v[i]);
  19. }
  20. sort(v + 1 , v + N + 1 , cmp);//从1开始的sort的写法//
  21. //状态转移方程//
  22. for(int i = 1 ; i <= N ; i ++){
  23. for(int V = M ; V >= v[i] ; V --){//这个地方的V已经代表了所有的情况了//
  24. if(dp[V] <= dp[V - v[i]] + v[i]){
  25. dp[V] = dp[V - v[i]] + v[i];
  26. choice[i][V] = 1;//使用了一枚硬币//
  27. }
  28. else choice[i][V] = 0;//没有使用一枚硬币//
  29. }
  30. }
  31. if(dp[M] != M){
  32. printf("No Solution");
  33. }
  34. else{
  35. //记录整个路径//
  36. int k = N , num = 0 , c = M;
  37. while(k >= 0){
  38. if(choice[k][c] == 1){//如果说第k个状态下使用了//
  39. flag[k] = true;//该种硬币标记为已经使用过了//
  40. c = c - v[k];//价值减少//
  41. num ++;
  42. }
  43. else{
  44. flag[k] = false;//没有就标记没有//
  45. }
  46. k --;//往前翻//
  47. }
  48. //输出//
  49. for(int i = N ; i >= 1 ; i --){
  50. if(flag[i] == true){
  51. printf("%d" , v[i]);
  52. num --;
  53. if(num > 0) printf(" ");
  54. }
  55. }
  56. }
  57. return 0;
  58. }

 

1069:The Black Hole of Numbers(20 分)(AC)

注意要点:

1.sort的写法.

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int a[5] = { 0 };
  5. bool cmp(int a , int b) {
  6. return a > b ;
  7. }
  8. void isarray(int N ) {
  9. for(int i = 0 ; i < 4 ; i ++) {
  10. a[i] = N % 10;
  11. N /= 10;
  12. }
  13. }
  14. int isnumber(int A[]) {
  15. int sum = 0;
  16. for(int i = 0 ; i < 4 ; i ++) {
  17. sum = sum * 10 + a[i];
  18. }
  19. return sum;
  20. }
  21. int main() {
  22. int N , min , max;
  23. scanf("%d" , &N);
  24. while(1) {
  25. isarray(N);
  26. sort(a , a + 4);
  27. min = isnumber(a);//最小值//
  28. sort(a , a + 4 , cmp);
  29. max = isnumber(a); //最大值//
  30. N = max - min ;
  31. printf("%04d - %04d = %04d\n" , max , min , N);
  32. if(N == 0 || N == 6174) break;
  33. }
  34. return 0;
  35. }

 

1086:Tree Traversals Again (25 分)(AC)

注意要点:

1.模板题,就是一个模拟一个栈的输入和输出。

  1. #include<iostream>
  2. #include<stack>
  3. #include<cstring>
  4. using namespace std;
  5. const int MAX = 50;
  6. stack<int> s;
  7. int N;
  8. int pre[MAX] , in[MAX] , pos[MAX];
  9. struct node{
  10. int data;
  11. node* lchild;
  12. node* rchild;
  13. };
  14. node* creat(int preL , int preR , int inL , int inR){
  15. //范围//
  16. if(preL > preR)
  17. return NULL;
  18. //创建根节点//
  19. node* root = new node;
  20. root->data = pre[preL];
  21. //在中序遍历中找到根节点//
  22. int k;
  23. for(k = inL ; k <= inR ; k ++) {//千万注意这个地方如果前面定义了,则后面不能定义。//
  24. if(pre[preL] == in[k]){
  25. break;
  26. }
  27. }
  28. //切分寻找;注意技巧:左右的范围其实是对应可以接起来的。//
  29. int numleft = k - inL ;
  30. root->lchild = creat(preL + 1 , preL + numleft , inL , k - 1);
  31. root->rchild = creat(preL + numleft + 1 , preR , k + 1 , inR);
  32. return root;
  33. }
  34. int num = 0 ;
  35. void postorder(node* root) {
  36. if(root == NULL)
  37. return ;
  38. postorder(root->lchild);
  39. postorder(root->rchild);
  40. printf("%d" , root->data);
  41. num ++;
  42. if(num < N)
  43. printf(" ");
  44. }
  45. int main() {
  46. int a , preindex = 0 , inindex = 0;
  47. char opera[10];
  48. //输入操作//
  49. scanf("%d" , &N);
  50. for(int i = 0 ; i < 2 * N ; i ++) {
  51. scanf("%s" , opera);
  52. if(strcmp(opera , "Push") == 0) {
  53. scanf("%d" , &a);
  54. pre[preindex ++] = a;
  55. s.push(a);
  56. }
  57. else {
  58. in[inindex ++] = s.top();
  59. s.pop();
  60. }
  61. }
  62. //建树, 这个地方注意是有几个根的数值就补几个。//
  63. node* root = creat(0 , N - 1, 0 , N - 1);
  64. //后序遍历//
  65. postorder(root);
  66. return 0;
  67. }

 

1101:Quick Sort(25 分)(AC)

注意要点:

1.思路很清晰,但是这个地方可以利用这个小技巧,因为你每次前面的数据就是这个这个最小值了,所以完全没有必要每次都去遍历前面的数据,直接可以与上一个数据进行比较就行。

2.本题目和QS完全没有任何关系,倒像是在给你介绍QS的原理。

2.这个地方注意有个坑,最后需要输出一个回车。我其实很费解这个东西。以后建议所有的题目之后都去写一个回车以防万一。

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. const int INF = 1000000000;
  5. int main() {
  6. int N , sum = 0;
  7. int a[100005] = {0};
  8. int leftmax[100005] = {0};
  9. int rightmin[100005] = {0};
  10. //input//
  11. scanf("%d" , &N);
  12. leftmax[0] = 0;
  13. rightmin[N - 1] = INF;
  14. for(int i = 0 ; i < N ; i ++) {
  15. scanf("%d" , &a[i]);
  16. }
  17. //leftmax:可修正,其实完全不必每次都把数据遍历一次//
  18. for(int i = 1 ; i < N ; i ++) {
  19. leftmax[i] = max(leftmax[i - 1] , a[i - 1]);
  20. }
  21. //rightmin,这个地方你想,如果要是N - 1 的话,N - 1 + 1 不就翻出数组外头去了。。//
  22. for(int i = N - 2; i >= 0 ; i --) {
  23. rightmin[i] = min(rightmin[i + 1] , a[i + 1]);
  24. }
  25. //statistic//
  26. for(int i = 0 ; i < N ; i ++) {
  27. if(a[i] > leftmax[i] && a[i] < rightmin[i]) {
  28. sum ++;
  29. }
  30. }
  31. //output//
  32. printf("%d\n" , sum);
  33. for(int i = 0 ; i < N ; i ++) {
  34. if(a[i] > leftmax[i] && a[i] < rightmin[i]) {
  35. printf("%d" , a[i]);
  36. sum--;
  37. if(sum != 0) printf(" ");
  38. }
  39. }
  40. printf("\n");//无厘头的要求。//
  41. return 0;
  42. }

 

1107:Social Clusters(30 分)(AC)

注意要点:

1/并查集。最难的不是并查集,而是主函数。

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int father[1005] = {0} ;
  5. int isroot[1005] = {0} ;
  6. int hobby[1005] = {0};
  7. void init(int N) {
  8. for(int i = 1 ; i <= N ; i ++) {
  9. father[i] = i;
  10. isroot[i] = false;
  11. }
  12. }
  13. bool cmp(int a , int b) {
  14. return a > b ;
  15. }
  16. int findfather(int x) {
  17. int a = x;
  18. while(x != father[x]) {
  19. x = father[x];
  20. }
  21. while(a != father[a]){
  22. int z = a;
  23. a = father[a];
  24. father[z] = x ;
  25. }
  26. return x;
  27. }
  28. void Union(int a , int b) {
  29. int A = findfather(a);
  30. int B = findfather(b);
  31. if(A != B) {
  32. father[A] = B ;
  33. }
  34. }
  35. int main() {
  36. int N , k , d , sum = 0;
  37. scanf("%d" , &N);
  38. init(N);
  39. for(int i = 1 ; i <= N ; i ++){
  40. scanf("%d: " , &k);
  41. for(int j = 0 ; j < k ; j ++) {
  42. scanf("%d" , &d);
  43. if(hobby[d] == 0) {
  44. hobby[d] = i;
  45. }
  46. Union(i , findfather(hobby[d]));
  47. }
  48. }
  49. for(int i = 1 ; i <= N ; i ++) {
  50. isroot[findfather(i)] ++;
  51. }
  52. for(int i = 1 ; i <= N ; i ++) {
  53. if(isroot[i] != 0) {
  54. sum ++;
  55. }
  56. }
  57. sort(isroot + 1 , isroot + N + 1 , cmp);
  58. printf("%d\n" , sum);
  59. for(int i = 1 ; i <= sum ; i++) {
  60. if(i == sum)
  61. printf("%d" , isroot[i]);
  62. else
  63. printf("%d " , isroot[i]);
  64. }
  65. return 0;
  66. }

1155. Heap Paths

解题思路:参考柳神。有的时候发现并不是不会做题,而是题目真的看不懂。。

1.利用dfs保存每条路径。(在dfs中打印数据)

2.判断大根堆和小根堆。(在大根堆中父亲节点的数据大于儿子节点的数据)

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int n , a[1005];
  5. vector<int> v;
  6. void dfs(int x){
  7. if(2 * x > n && 2 * x + 1 > n){//×ó¸ù½ÚµãµÄÊýÖµ´óÓÚÕû¸öÊý¾Ý && ÓÒ¸ú½ÚµãµÄÊý¾Ý´óÓÚÕû¸öÊý¾Ý//
  8. if(x <= n){//Õâ¸ö¸ùµÄ½ÚµãûÓгöÁ˽磬µ«ÊÇÕâ¸ö¸ùµÄ½Úµã³öÁ˽磬Ôò˵Ã÷Õâ¸öµØ·½µ½ÁËÄ©¶ËÁË//
  9. for(int i = 0 ; i < v.size() ; i ++){//Õâ¸öµØ·½Ï൱ÓÚÊǶÔÓÚÕû¸ö·¾¶µÄÒ»¸ö±éÀú¡£
  10. printf("%d%s" , v[i] , i != v.size() - 1 ? " " : "\n");
  11. }
  12. }
  13. }
  14. else{
  15. v.push_back(a[2 * x + 1]);//ÏȽ«ÓÒ½Úµã·ÅÈ룬±éÀúÓÒ½ÚµãϵÄÊ÷//
  16. dfs(2 * x + 1);
  17. v.pop_back();
  18. v.push_back(a[2 * x]);//ÔÙ½«×ó½Úµã·ÅÈ룬±éÀú×ó½ÚµãϵÄÊ÷//
  19. dfs(2 * x);
  20. v.pop_back();
  21. }
  22. }
  23. int main(){
  24. bool ismin = false , ismax = false;
  25. scanf("%d" , &n);
  26. for(int i = 1 ; i <= n ; i ++){
  27. scanf("%d" , &a[i]);
  28. }
  29. v.push_back(a[1]);
  30. dfs(1);
  31. for(int i = 2 ; i <= n ; i ++){//Õâ¸öµØ·½´ÓµÚ¶þ¸ö½Úµã¿ªÊ¼,Èç¹û´ÓµÚÒ»¸ö½ÚµãÒ²¿ÉÒÔ//
  32. if(a[i / 2] < a[i]) ismin = true;//Èç¹û×Ó½ÚµãµÄÊýÖµ±È¸ù½ÚµãµÄÊýֵҪСµÄ»°£¬ÊÇ´ó¸ù¶Ñ//
  33. if(a[i / 2] > a[i]) ismax = true;//Èç¹û×Ó½ÚµãµÄÊýÖµ±È¸ù½ÚµãµÄÊýÖµÒª´óµÄ»°£¬ÔòÊÇС¸ù¶Ñ//
  34. }
  35. if(ismax == true && ismin == true){
  36. printf("Not Heap");
  37. }
  38. else if(ismax == true){
  39. printf("Max Heap");
  40. }
  41. else if(ismin == true){
  42. printf("Min Heap");
  43. }
  44. return 0;
  45. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/627363
推荐阅读
相关标签
  

闽ICP备14008679号