这是该系列的第二期,以后每期都会更新10题目,且会一直保持更新(有一些暂时空缺的题目日后会补起来)。然后说明一下,有一些题目因为实在太简单了,就没有写思路或感想,直接分享代码了,所以大家懂得都懂,相信这种题目也难不住大家的。还有因为Advanced中涉及到比较多的数据结构和算法的内容,但是我本人还在学习算法与数据结构,所以可能接下来一段时间会暂缓更新,以数据结构和算法的学习为主。

1021:Deepest Root

此题我还没有AC,主要是有一个Checkpoint显示内存超限,正在想办法优化空间存储。这道题的主要思路是迪杰斯特拉最短路算法+用一个并查集来记录图中的连通分量。
此题代码如下:

  1. #include<iostream>
  2. #include<queue>
  3. using namespace std;
  4. int **a;
  5. int N,maxlen;
  6. int *vis,*dis,*b;
  7. int min1 = 99999999;
  8. int u = 0;
  9. int flag = 0;
  10. queue<int> q;
  11. void dijkstra(int input);
  12. int Checkmax();
  13. int Findparent(int index);
  14. void Union(int index1, int index2);
  15. bool Check(int index1, int index2);
  16. int main(){
  17. maxlen = 0;
  18. cin >> N;
  19. a = new int*[N];
  20. vis = new int[N];
  21. dis = new int[N];
  22. b = new int[N];
  23. for(int i = 0;i < N;i++){
  24. a[i] = new int[N];
  25. b[i] = -1;
  26. }
  27. for (int i = 0; i < N; i++){
  28. for (int j = 0; j < N; j++){
  29. if (i == j)
  30. a[i][j] = 0;
  31. else
  32. a[i][j] = 99999999;
  33. }
  34. }
  35. int index1,index2;
  36. for(int i = 0;i < N-1;i++){
  37. cin >> index1 >> index2;
  38. a[index1-1][index2-1] = a[index2-1][index1-1] = 1;
  39. if(Check(index1-1,index2-1) == false)
  40. Union(index1-1,index2-1);
  41. else if(Check(index1-1,index2-1) == true && flag == 0)
  42. flag = 1;
  43. }
  44. if(flag == 1){
  45. int count = 0;
  46. for(int i = 0; i < N;i++){
  47. if(b[i] < 0)
  48. count++;
  49. }
  50. cout<<"Error: "<<count<<" components";
  51. return 0;
  52. }
  53. for(int i = 0;i < N;i++){
  54. for(int j = 0;j < N;j++){
  55. vis[j] = 0;
  56. dis[j] = a[i][j];
  57. }
  58. vis[i] = 1;
  59. dijkstra(i);
  60. if(i == 0){
  61. maxlen = Checkmax();
  62. q.push(i);
  63. continue;
  64. }
  65. else if(Checkmax() > maxlen){
  66. maxlen = Checkmax();
  67. q = queue<int>();
  68. q.push(i);
  69. }
  70. else if(Checkmax() == maxlen)
  71. q.push(i);
  72. }
  73. while(q.size() != 0){
  74. cout<<(q.front()+1)<<endl;
  75. q.pop();
  76. }
  77. return 0;
  78. }
  79. void dijkstra(int input){
  80. for (int i = 0; i < N - 1; i++){
  81. min1 = 99999999;
  82. // 寻找权值最小的点u
  83. for (int j = 0; j < N; j++){
  84. if (vis[j] == 0 && dis[j] < min1){
  85. min1 = dis[j];
  86. u = j;
  87. }
  88. }
  89. vis[u] = 1;
  90. for (int v = 0; v < N; v++){
  91. // 对于每个u可达的v来说
  92. if (a[u][v] < 99999999){
  93. // 如果当前的dis[v]不满足三角形不等式,那么进行松弛操作
  94. if (dis[v] > dis[u] + a[u][v]){
  95. dis[v] = dis[u] + a[u][v];
  96. }
  97. }
  98. }
  99. }
  100. }
  101. int Checkmax(){
  102. int temp = -1;
  103. for(int i = 0;i < N;i++){
  104. if(temp == -1)
  105. temp = dis[i];
  106. else if(dis[i] > temp)
  107. temp = dis[i];
  108. }
  109. return temp;
  110. }
  111. //找父亲节点
  112. int Findparent(int index){
  113. int temp = index;
  114. while(b[temp] >= 0){
  115. temp = b[temp];
  116. }
  117. //路径压缩
  118. if(index != temp)
  119. b[index] = temp;
  120. return temp;
  121. }
  122. //并,需要用到路径压缩和根据集合大小union
  123. void Union(int index1, int index2){
  124. int root1 = Findparent(index1);
  125. int root2 = Findparent(index2);
  126. //小的集合并到大的集合中
  127. if(b[root1] >= b[root2]){
  128. int temp = b[root1];
  129. b[root1] = root2;
  130. b[root2] += temp;
  131. }
  132. else{
  133. int temp = b[root2];
  134. b[root2] = root1;
  135. b[root1] += temp;
  136. }
  137. }
  138. //查,查找两个节点
  139. bool Check(int index1, int index2){
  140. if(Findparent(index1) == Findparent(index2))
  141. return true;
  142. else
  143. return false;
  144. }

1022:Digital Library

此题代码如下:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. class Node2{
  5. public:
  6. long int ID;
  7. string n;
  8. string author;
  9. string kw[5];
  10. int kwn;
  11. string pub;
  12. string y;
  13. Node2(){kwn = 0;}
  14. Node2 &operator=(const Node2& input){
  15. if(this == &input)
  16. return *this;
  17. this->ID = input.ID;
  18. this->n = input.n;
  19. this->author = input.author;
  20. for(int i = 0;i < input.kwn;i++)
  21. this->kw[i] = input.kw[i];
  22. this->kwn = input.kwn;
  23. this->pub = input.pub;
  24. this->y = input.y;
  25. return *this;
  26. }
  27. };
  28. class Node{
  29. public:
  30. Node2 value;
  31. Node* next;
  32. Node(){ next = NULL; }
  33. Node2 Getvalue() { return this->value; }
  34. Node* Getnext() { return this->next; }
  35. void Setvalue(Node2 num) { value = num; }
  36. void Setnext(Node* a) { next = a; }
  37. };
  38. class Nodearray{
  39. public:
  40. Node* head;
  41. Node* tail;
  42. int total;
  43. Nodearray(){
  44. head = NULL;
  45. tail = NULL;
  46. total = 0;
  47. }
  48. void Addnum(Node2 num){
  49. total++;
  50. if (head == NULL){
  51. head = new Node;
  52. head->Setvalue(num);
  53. head->Setnext(NULL);
  54. tail = head;
  55. }
  56. else{
  57. Node* p = this->head;
  58. Node* tempp = p;
  59. while(p != NULL){
  60. if(num.ID > (p->Getvalue()).ID){
  61. tempp = p;
  62. p = p->Getnext();
  63. }
  64. else{
  65. Node* temp;
  66. temp = new Node;
  67. temp->Setvalue(num);
  68. if(p == this->head){
  69. temp->Setnext(p);
  70. this->head = temp;
  71. return;
  72. }else{
  73. temp->Setnext(p);
  74. tempp->Setnext(temp);
  75. return;
  76. }
  77. }
  78. }
  79. tempp->Setnext(new Node);
  80. tempp = tempp->Getnext();
  81. tempp->Setvalue(num);
  82. tempp->Setnext(NULL);
  83. return;
  84. }
  85. }
  86. };
  87. int N,M;
  88. char c;
  89. Nodearray a;
  90. int main(){
  91. cin >> N;
  92. Node2 temp;
  93. string s;
  94. for(int n = 0;n < N;n++){
  95. temp.kwn = 0;
  96. cin >> temp.ID;
  97. c = getchar();
  98. getline(cin,temp.n);
  99. getline(cin,temp.author);
  100. getline(cin,s);
  101. while(s.find_first_of(" ") < s.size()){
  102. temp.kw[temp.kwn++] = s.substr(0,s.find_first_of(" "));
  103. s = s.substr(s.find_first_of(" ")+1,s.size() - (s.find_first_of(" ")+1) );
  104. }
  105. temp.kw[temp.kwn++] = s;
  106. getline(cin,temp.pub);
  107. cin >> temp.y;
  108. a.Addnum(temp);
  109. }
  110. cin >> M;
  111. string s2,s3;
  112. int flag;
  113. for(int m = 0;m < M;m++){
  114. flag = 0;
  115. cin >> s2;
  116. c = getchar();
  117. getline(cin,s3);
  118. cout<<s2<<' '<<s3<<endl;
  119. Node *p = a.head;
  120. while(p != NULL){
  121. if(s2[0] == '1'){
  122. if(p->Getvalue().n == s3){
  123. cout<<p->Getvalue().ID<<endl;
  124. if(flag == 0)
  125. flag = 1;
  126. }
  127. }else if(s2[0] == '2'){
  128. if(p->Getvalue().author == s3){
  129. cout<<p->Getvalue().ID<<endl;
  130. if(flag == 0)
  131. flag = 1;
  132. }
  133. }else if(s2[0] == '3'){
  134. for(int i = 0;i < p->Getvalue().kwn;i++){
  135. //cout<<p->Getvalue().kw[i]<<' '<<s3<<endl;
  136. if(p->Getvalue().kw[i] == s3){
  137. cout<<p->Getvalue().ID<<endl;
  138. if(flag == 0)
  139. flag = 1;
  140. break;
  141. }
  142. }
  143. }else if(s2[0] == '4'){
  144. if(p->Getvalue().pub == s3){
  145. cout<<p->Getvalue().ID<<endl;
  146. if(flag == 0)
  147. flag = 1;
  148. }
  149. }else if(s2[0] == '5'){
  150. if(p->Getvalue().y == s3){
  151. cout<<p->Getvalue().ID<<endl;
  152. if(flag == 0)
  153. flag = 1;
  154. }
  155. }
  156. p = p->Getnext();
  157. }
  158. if(flag == 0)
  159. cout<<"Not Found"<<endl;
  160. }
  161. return 0;
  162. }

1023:Have Fun with Numbers

此题代码如下:

#include<iostream>
#include<string>
#define Maxsize 20

using namespace std;
string s;
int a[Maxsize] = {0};

int main(){
    cin >> s;
    for(int i = 0;i < s.size();i++)
        a[(int)s[i] - 48] ++;
    int addnum = 0;
    int tempnum;
    for(int i = s.size() - 1;i > -1;i--){
        tempnum = ((int)s[i] - 48) * 2 + addnum;
        addnum = tempnum / 10;
        s[i] = tempnum % 10 + '0';
    }
    if(addnum == 1)
        s = "1" + s;
    for(int i = 0;i < s.size();i++){
        if(a[(int)s[i] - 48] < 0){
            cout<<"No"<<endl;
            cout<<s;
            return 0;
        }
        a[(int)s[i] - 48] --;
    }
    for(int i = 0;i < Maxsize;i++){
        if(a[(int)s[i] - 48] != 0){
            cout<<"No"<<endl;
            cout<<s;
            return 0;
        }
    }
    cout<<"Yes"<<endl;
    cout<<s;
    return 0;
}

1024:Palindromic Number

字符串类问题如果显示“运行时错误”的话,那一定是字符串没法用long int表示。
此题代码如下:

#include<iostream>
#include<string>

using namespace std;
string temp,temp2;
int K;

string Add(string s1,string s2);

int main(){
    cin >> temp >> K;
    if(K == 0 || temp.size() == 1){
        cout<<temp<<endl;
        cout<<'0';
        return 0;
    }
    for(int i = 0;i < temp.size()/2;i++){
        if(temp[i] != temp[temp.size()-i-1])
            break;
        if(i == (temp.size()/2 - 1)){
            cout<<temp<<endl;
            cout<<'0';
            return 0;
        }
    }
    temp2 = "";
    int flag = 0;
    for(int i = 0;i < K;i++){
        for(int j = 0;j < temp.size();j++)
            temp2 += temp[temp.size()-j-1];
        temp = Add(temp,temp2);
        //cout<<temp<<endl;
        for(int j = 0;j < temp.size()/2;j++){
            if(temp[j] != temp[temp.size()-j-1])
                break;
            if(j == (temp.size()/2-1)){
                cout<<temp<<endl;
                cout<<(i+1);
                flag = 1;
                return 0;
            }
        }
        temp2 = "";
        if(i == (K -1)){
            cout<<temp<<endl;
            cout<<K;
        }
    }
    return 0;
}

string Add(string s1,string s2){
    int addnum = 0;
    int i = 0;
    int tempnum;
    while(i != s1.size() && i != s2.size()){
        tempnum = (int)s1[s1.size()-i-1] + (int)s2[s2.size()-i-1] + addnum - 96;
        s1[s1.size()-i-1] = tempnum % 10 + '0';
        addnum = tempnum / 10;
        i++;
    }
    if(addnum != 0)
        s1 = "1" + s1;
    return s1;
}

1025:PAT Ranking

这道题我最后用到了希尔排序归并排序(两个有序子列的归并)两种排序方法。
此题代码如下:

#include<iostream>
#include<string>
#include<cmath>
#define Maxsize2 30000
#define Maxsize 300

using namespace std;

class Node{
public:
    string r;
    int g;
    int fr;
    int l;
    int lr;
    Node(){
        r = " ";
    }
};

int N,K,t,D;
int num = 0;
Node *total,*temp,*temptotal,*H1,*H2;
string t1;

void HSort(Node *H,int n);
void Merge(int start,int leftend,Node *a,Node *b);

int main(){
    cin >> N;
    total = new Node[Maxsize2];
    temptotal = new Node[Maxsize2];
    temp = new Node[Maxsize];
    for(int i = 0;i < N;i++){
        cin >> K;
        for(int j = 0;j < K;j++)
            cin >> temp[j].r >> temp[j].g;
        HSort(temp,K);
        int tempnum;
        for(int j = 0;j < K;j++){
            temp[j].l = i + 1;
            if(j != 0 && temp[j].g == temp[j-1].g)
                temp[j].lr = tempnum;
            else{
                tempnum = j + 1;
                temp[j].lr = j + 1;
            }
        }
        if(i % 2 == 0){
            H1 = total;
            H2 = temptotal;
        }
        else{
            H2 = total;
            H1 = temptotal;
        }
        for(int j = 0;j < K;j++){
                H1[j + num].r = temp[j].r;
                H1[j + num].g = temp[j].g;
                H1[j + num].l = temp[j].l;
                H1[j + num].lr = temp[j].lr;
        }
        if(i != 0)
            Merge(0,num-1,H1,H2);
        else{
            for(int j = 0;j < K;j++){
                temptotal[j].r = total[j].r;
                temptotal[j].g = total[j].g;
                temptotal[j].l = total[j].l;
                temptotal[j].lr = total[j].lr;
            }
        }
        num += K;
    }
    if(N % 2 != 0){
        for(int j = 0;j < num;j++){
            total[j].r = temptotal[j].r;
            total[j].g = temptotal[j].g;
            total[j].l = temptotal[j].l;
            total[j].lr = temptotal[j].lr;
        }
    }
    int tempnum;
    for(int j = 0;j < num;j++){
        if(j != 0 && total[j].g == total[j-1].g)
            total[j].fr = tempnum;
        else{
            tempnum = j + 1;
            total[j].fr = j + 1;
        }
    }
    cout<<num<<endl;
    for(int i = 0;i < num;i++)
        cout<<total[i].r<<' '<<total[i].fr<<' '<<total[i].l<<' '<<total[i].lr<<endl;
    return 0;
}

void HSort(Node *H,int n){
    int count = 1;
    while((int)pow(2,count) - 1 < n)
        count++;
    count--;
    for(int i = count;i > 0;i--){
        D = (int)pow(2,i) - 1;
        for(int j = 0;j < D;j++){
            for(int k = j;k < n;k += D){
                if(k == j)
                    continue;
                t1 = H[k].r;
                t = H[k].g;
                for(int p = j;p < k;p += D){
                    if((t > H[p].g)||(t == H[p].g && t1 < H[p].r)){
                        for(int s = k;s > p;s -= D){
                            H[s].r = H[s-D].r;
                            H[s].g = H[s-D].g;
                        }
                        H[p].r = t1;
                        H[p].g = t;
                        break;
                    }
                }
            }
        }
    }
}

void Merge(int start,int leftend,Node *a,Node *b){
    int l = start;
    int r = leftend + 1;
    int end = leftend + K;
    while(l <= leftend && r <= end){
        if(a[l].g > a[r].g || (a[l].g == a[r].g && a[l].r < a[r].r)){
            b[start].r = a[l].r;
            b[start].g = a[l].g;
            b[start].l = a[l].l;
            b[start].lr = a[l].lr;
            l++;
        }
        else{
            b[start].r = a[r].r;
            b[start].g = a[r].g;
            b[start].l = a[r].l;
            b[start].lr = a[r].lr;
            r++;
        }
        start++;
    }
    while(l <= leftend){
        b[start].r = a[l].r;
        b[start].g = a[l].g;
        b[start].l = a[l].l;
        b[start].lr = a[l].lr;
        start++;l++;
    }
    while(r <= end){
        b[start].r = a[r].r;
        b[start].g = a[r].g;
        b[start].l = a[r].l;
        b[start].lr = a[r].lr;
        start++;r++;
    }
}

1026:Table Tennis

这题其实后来我知道我自己思路错了,下面是我后来想的思路:

  • 从所有桌中找一个最快服务完的桌,看看这个桌是不是VIP桌
  • 如果是VIP桌,则看看有没有已经到了的VIP用户
  • 看下有没有已经到了的VIP用户,有就服务他,没有就从队列里拉个最快到的用户
  • 然后接着从所有桌中找一个最快服务完的桌
  • 如果这个桌是VIP桌,看下有没有已经到了的VIP用户,有就服务他,没有就从剩下用户中拉个最快到的
  • 一直循环
  • 知道最后所有桌的服务完的时间已经超过了21:00,这时候看看最后一批服务完的用户有没有21:00之前到的,有就放到队列里

此题代码如下:

#include<iostream>
#include<string>
#include<cmath>

using namespace std;
class Node{
public:
    long int arr;
    int pla;
    long int lea;
    int tag;
    int ind;
    Node &operator=(const Node& aa){
        if(this == &aa)
            return *this;
        this->arr = aa.arr;
        this->pla = aa.pla;
        this->lea = aa.lea;
        this->tag = aa.tag;
        this->ind = aa.ind;
        return *this;
    }
};

int N,K,M,tempN;
Node *a,*b;
long int *now;
Node *nowpla;
int *serve,*spe2;
int flag;

long int totime(string s);
int r(long int a,long int b);
string tostr(long int num);
void Swap(Node &a, Node &b);
int findmin();
int findmin2();
long int maxnum(long int a,long int b);
void HSort(Node *H,int n);

int main(){
    cin >> N;
    a = new Node[N];
    b = new Node[N];
    string s;
    for(int i = 0;i < N;i++){
        cin >> s >> a[i].pla >> a[i].tag;
        if(a[i].pla > 120)
            a[i].pla = 120;
        a[i].arr = totime(s);
    }
    HSort(a,N);
    int index;
    cin >> K >> M;
    tempN = N;
    serve = new int[K];
    spe2 = new int[K];
    now = new long int[K];
    nowpla = new Node[K];
    for(int i = 0;i < M;i++){
        cin >> index;
        spe2[index-1] = 1;
    }
    for(int i = 0;i < K;i++)
        nowpla[i].tag = -1;
    int flag;
    while(tempN != 0){
        flag = 0;
        index = findmin();
        if(now[index] > 46800)
            break;
        if(spe2[index] == 1){
            for(int i = N-tempN;i < N;i++){
                if(a[i].arr > now[index])
                    break;
                else if(a[i].arr <= now[index] && a[i].tag == 1){
                    Node temp = a[i];
                    for(int j = i;j > N- tempN;j--)
                        a[j] = a[j-1];
                    a[N-tempN] = temp;
                    flag = 1;
                    break;
                }
            }
        }
        if(flag == 0)
            index = findmin2();
        if(a[N-tempN].tag == 1){
            for(int i = 0;i < K;i++){
                if(spe2[i] == 1 && now[i] <= a[N-tempN].arr){
                    index = i;
                    break;
                }
            }
        }
        //cout<<flag<<' '<<tostr(a[N-tempN].arr)<<' '<<N-tempN<<' '<<index<<endl;
        a[N-tempN].ind = N - tempN;
        a[N-tempN].lea = maxnum(now[index],a[N-tempN].arr);
        now[index] = maxnum(now[index],a[N-tempN].arr) + a[N-tempN].pla * 60;
        if(nowpla[index].tag != -1){
            b[nowpla[index].ind] = nowpla[index];
            serve[index] ++;
        }
        nowpla[index] = a[N-tempN];
        tempN--;
    }
    for(int i = 0;i < K;i++){
        if(now[i] - nowpla[i].pla * 60 <= 46800 && now[i] > 0){
            b[nowpla[i].ind] = nowpla[i];
            serve[i] ++;
        }
    }
    for(int i = 0;i < N - tempN;i++){
        if(i != 0 && b[i].arr == 0)
            break;
        cout<<tostr(b[i].arr)<<' '<<tostr(b[i].lea)<<' '<<r(b[i].lea,b[i].arr)<<endl;
    }
    cout<<serve[0];
    for(int i = 1;i < K;i++)
        cout<<' '<<serve[i];
    return 0;
}

long int maxnum(long int a,long int b){
    if(a >= b)
        return a;
    else
        return b;
}

long int totime(string s){
    int pos1 = s.find_first_of(":");
    int pos2 = s.find_last_of(":");
    long int num = 0; 
    num += (stoi(s.substr(0,pos1)) - 8) * 3600;
    num += stoi(s.substr(pos1+1,pos2-pos1-1)) * 60;
    num += stoi(s.substr(pos2+1,s.size()-pos2-1));
    return num;
}

void Swap(Node &a, Node &b){
    Node temp1;
    temp1 = a;
    a = b;
    b = temp1;
}


int findmin(){
    int minnum = -1;
    for(int i = 0;i < K;i++){
        if(minnum == -1){
            minnum = i;
            continue;
        }
        if(now[minnum] > now[i])
            minnum = i;
    }
    return minnum;
}

int findmin2(){
    int mini = -1;
    for(int i = 0;i < K;i++){
        if(now[i] <= a[N-tempN].arr)
            return i;
        else if(mini == -1)
            mini = i;
        else if(a[i].arr < a[mini].arr)
            mini = i;
    }
    return mini;
}

string tostr(long int num){
    string t;
    int hour = num / 3600 + 8;
    num = num % 3600;
    int minute = num / 60;
    num = num % 60;
    string h = to_string(hour);
    string m = to_string(minute);
    string se = to_string(num);
    if(h.size() == 1)
        h = '0' + h;
    if(m.size() == 1)
        m = '0' + m;
    if(se.size() == 1)
        se = '0' + se;
    t = h + ':' + m + ':' + se;
    return t;
}

int r(long int a,long int b){
    int temp = (a - b) / 60;
    a = (a - b) % 60;
    if(a >= 30)
        temp += 1;
    return temp;
}

void HSort(Node *H,int n){
    int count = 1;
    while((int)pow(2,count) - 1 < n)
        count++;
    count--;
    for(int i = count;i > 0;i--){
        int D = (int)pow(2,i) - 1;
        for(int j = 0;j < D;j++){
            for(int k = j;k < n;k += D){
                if(k == j)
                    continue;
                Node temp = H[k];
                for(int p = j;p < k;p += D){
                    if(temp.arr < H[p].arr){
                        for(int s = k;s > p;s -= D)
                            H[s] = H[s-D];
                        H[p] = temp;
                        break;
                    }
                }
            }
        }
    }
}

1027:Colors in Mars

此题代码如下:

#include<iostream>
#include<string>
#define radix 13

using namespace std;
int n;

string Transform(int n);

int main(){
    cout<<'#';
    for(int i = 0;i < 3;i++){
        cin >> n;
        cout<<Transform(n);
    }
    return 0;
}

string Transform(int n){
    string temp = "";
    int tempnum;
    while(n > radix){
        tempnum = n / radix;
        if(tempnum < 10)
            temp += (tempnum + '0');
        else if(tempnum == 10)
            temp += 'A';
        else if(tempnum == 11)
            temp += 'B';
        else if(tempnum == 12)
            temp += 'C';
        n = n % radix;
    }
    if(n < 10)
        temp += (n + '0');
    else if(n == 10)
        temp += 'A';
    else if(n == 11)
        temp += 'B';
    else if(n == 12)
        temp += 'C';
    if(temp.size() == 1)
        temp = "0" + temp;
    return temp;
}

1028:List Sorting

此题代码如下:

#include<iostream>
#include<string>
#include<cmath>

using namespace std;

class Node{
public:
    string ID;
    string name;
    int g;
};

int N,C,D;
string t1,t2;
int t3;
Node *a;

void HSort1(Node *H,int n);
void HSort2(Node *H,int n);
void HSort3(Node *H,int n);

int main(){
    cin >> N >> C;
    a = new Node[N];
    for(int i = 0;i < N;i++)
        cin >> a[i].ID >> a[i].name >> a[i].g;
    if(C == 1)
        HSort1(a,N);
    else if(C == 2)
        HSort2(a,N);
    else
        HSort3(a,N);
    for(int i = 0;i < N;i++)
        cout<<a[i].ID<<' '<<a[i].name<<' '<<a[i].g<<endl;
    return 0;
}

void HSort1(Node *H,int n){
    int count = 1;
    while((int)pow(2,count) - 1 < n)
        count++;
    count--;
    for(int i = count;i > 0;i--){
        D = (int)pow(2,i) - 1;
        for(int j = 0;j < D;j++){
            for(int k = j;k < n;k += D){
                if(k == j)
                    continue;
                t1 = H[k].ID;
                t2 = H[k].name;
                t3 = H[k].g;
                for(int p = j;p < k;p += D){
                    if(t1 < H[p].ID){
                        for(int s = k;s > p;s -= D){
                            H[s].ID = H[s-D].ID;
                            H[s].name = H[s-D].name;
                            H[s].g = H[s-D].g;
                        }
                        H[p].ID = t1;
                        H[p].name = t2;
                        H[p].g = t3;
                        break;
                    }
                }
            }
        }
    }
}

void HSort2(Node *H,int n){
    int count = 1;
    while((int)pow(2,count) - 1 < n)
        count++;
    count--;
    for(int i = count;i > 0;i--){
        D = (int)pow(2,i) - 1;
        for(int j = 0;j < D;j++){
            for(int k = j;k < n;k += D){
                if(k == j)
                    continue;
                t1 = H[k].ID;
                t2 = H[k].name;
                t3 = H[k].g;
                for(int p = j;p < k;p += D){
                    if(t2.compare(H[p].name) < 0 || (t2.compare(H[p].name) == 0 && t1 < H[p].ID)){
                        for(int s = k;s > p;s -= D){
                            H[s].ID = H[s-D].ID;
                            H[s].name = H[s-D].name;
                            H[s].g = H[s-D].g;
                        }
                        H[p].ID = t1;
                        H[p].name = t2;
                        H[p].g = t3;
                        break;
                    }
                }
            }
        }
    }
}

void HSort3(Node *H,int n){
    int count = 1;
    while((int)pow(2,count) - 1 < n)
        count++;
    count--;
    for(int i = count;i > 0;i--){
        D = (int)pow(2,i) - 1;
        for(int j = 0;j < D;j++){
            for(int k = j;k < n;k += D){
                if(k == j)
                    continue;
                t1 = H[k].ID;
                t2 = H[k].name;
                t3 = H[k].g;
                for(int p = j;p < k;p += D){
                    if(t3 < H[p].g || (t3 == H[p].g && t1 < H[p].ID)){
                        for(int s = k;s > p;s -= D){
                            H[s].ID = H[s-D].ID;
                            H[s].name = H[s-D].name;
                            H[s].g = H[s-D].g;
                        }
                        H[p].ID = t1;
                        H[p].name = t2;
                        H[p].g = t3;
                        break;
                    }
                }
            }
        }
    }
}

1029:Median

此题代码如下:

#include<iostream>

using namespace std;
int N,Na,Nb;
long int *a,*b;

int main(){
    cin >> N;
    Na = N;
    a = new long int[N];
    for(int i = 0;i < N;i++)
        cin >> a[i];
    cin >> N;
    Nb = N;
    b = new long int[N];
    for(int i = 0;i < N;i++)
        cin >> b[i];
    int ia = 0;
    int ib = 0;
    int count = 0;
    if((Na + Nb) % 2 == 1){
        while(true){
            if(a[ia] < b[ib]){
                ia++;
                count++;
                if(count == (Na + Nb) / 2 + 1){
                    cout<<a[ia-1];
                    return 0;
                }
            }else if(a[ia] > b[ib]){
                ib++;
                count++;
                if(count == (Na + Nb) / 2 + 1){
                    cout<<b[ib-1];
                    return 0;
                }
            }
            else{
                if(count == (Na + Nb) / 2 || count == (Na + Nb) / 2 - 1){
                    cout<<a[ia];
                    return 0;
                }
                count += 2;
                ia++;
                ib++;
            }
        }
    }
    else{
        int num1,num2;
        while(true){
            if(a[ia] < b[ib]){
                ia++;
                count++;
                if(count == (Na + Nb) / 2)
                    num1 = a[ia-1];
                else if(count == (Na + Nb) / 2 + 1){
                    num2 = a[ia-1];
                    cout<<(float)(num1 + num2) / 2;
                    return 0;
                }
            }else if(a[ia] > b[ib]){
                ib++;
                count++;
                if(count == (Na + Nb) / 2)
                    num2 = b[ib-1];
                else if(count == (Na + Nb) / 2 + 1){
                    num2 = b[ib-1];
                    cout<<(float)(num1 + num2) / 2;
                    return 0;
                }
            }
            else{
                if(count == (Na + Nb) / 2 - 1){
                    cout<<a[ia];
                    return 0;
                }else if(count == (Na + Nb) / 2){
                    num2 = a[ia];
                    cout<<(float)(num1 + num2) / 2;
                    return 0;
                }else if(count == (Na + Nb) / 2 - 2){
                    num1 = a[ia];
                }
                count += 2;
                ia++;
                ib++;
            }
        }
    }
    return 0;
}

1030:Travel Plan

此题代码如下:

#include<iostream>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#define inf 10000000
using namespace std;
struct node
{
    int dis;
    int cost=inf;
};
node a[505][505];
int minn[505];
int path[505];
int dist[505];
int mark[505];
int main()
{
    int n,m,start,endd;
    cin>>n>>m>>start>>endd;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i==j) a[i][j].dis=0;
            else
                a[i][j].dis=inf;
        }
    }
    for(int i=0;i<m;i++)
    {
        int b,c,d,e;
        cin>>b>>c>>d>>e;
        a[b][c].dis=a[c][b].dis=d;
        a[b][c].cost=a[c][b].cost=e;
    }
    for(int i=0;i<n;i++)
    {
        dist[i]=a[start][i].dis;
        if(dist[i]!=inf&&i!=start) path[i]=start;
        else
            path[i]=-1;
        minn[i]=a[start][i].cost;
    }
    mark[start]=1;
    for(int i=0;i<n-1;i++)
    {
        int xiao=inf;
        int biaoji;
        for(int j=0;j<n;j++)
        {
            if(mark[j]==0&&dist[j]<xiao)
            {
                xiao=dist[j];
                biaoji=j;
            }
        }
        mark[biaoji]=1;
        for(int j=0;j<n;j++)
        {
            if(mark[j]==0)
            {
                if(dist[biaoji]+a[biaoji][j].dis<dist[j])
                {
                    dist[j]=dist[biaoji]+a[biaoji][j].dis;
                    minn[j]=minn[biaoji]+a[biaoji][j].cost;
                    path[j]=biaoji;
                }
                else if(dist[biaoji]+a[biaoji][j].dis==dist[j])
                {
                    if(minn[biaoji]+a[biaoji][j].cost<minn[j])
                    {
                        minn[j]=minn[biaoji]+a[biaoji][j].cost;
                        path[j]=biaoji;
                    }
                }
            }

        }
    }
    int lu[505];
    lu[0]=endd;
    int num=1;
    int tmp=endd;
    while(path[tmp]!=start)
    {
        lu[num++]=path[tmp];
        tmp=path[tmp];
    }
    cout<<start;
    for(int i=num-1;i>=0;i--)
    {
        cout<<" "<<lu[i];
    }
    cout<<" "<<dist[endd]<<" "<<minn[endd];

}

阶段性总结