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


    准备每天刷两题PAT真题

    1001 A+B Format 

    模拟输出,注意格式

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 string ans = "";
     8 
     9 int main() {
    10     int a, b, c, cnt = 0;
    11     cin >> a >> b;
    12     c = a + b;
    13     if(c == 0) {
    14         cout << 0 << endl;
    15         return 0;
    16     }
    17     while(c) {
    18         if(cnt % 3 == 0 && cnt != 0) ans = ans + ",";
    19         char ch = abs(c % 10) + '0';
    20         ans = ans + ch;
    21         c /= 10;
    22         cnt++;
    23     }
    24     reverse(ans.begin(), ans.end());
    25     if(a + b < 0) ans = "-" + ans ;
    26     cout << ans << endl;
    27     return 0;
    28 }
    View Code

    1002 A+B for Polynomials 

    map存数,注意系数正负。

     1 #include <map>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 map<int, double> m;
     9 
    10 int main() {
    11     double a;
    12     int k, n, cnt = 0, mx = 0;
    13     scanf("%d", &k);
    14     for(int i = 1; i <= k; i++) {
    15         scanf("%d%lf", &n, &a);
    16         mx = max(mx, n);
    17         m[n] = m[n] + a;
    18     }
    19     scanf("%d", &k);
    20     for(int i = 1; i <= k; i++) {
    21         scanf("%d%lf", &n, &a);
    22         mx = max(mx, n);
    23         m[n] = m[n] + a;
    24     }
    25     for(int i = mx; i >= 0; i--) {
    26         if(m[i] != 0) cnt++;
    27     }
    28     printf("%d", cnt);
    29     for(int i = mx; i >= 0; i--) {
    30         if(m[i] != 0) printf(" %d %.1f", i, m[i]);
    31     }
    32     return 0;
    33 }
    View Code

    1003 Emergency 

    单调队列优化dijkstra,注意标记点,路径长度相同,当前点增加路径数目,同时更新当前点人员数目。

     1 #include <queue>
     2 #include <vector>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <iostream>
     6 #include <algorithm>
     7 using namespace std;
     8 
     9 const int N = 500 + 10;
    10 bool vis[N];
    11 int a[N], cnt[N], sum[N], d[N];
    12 int n, m, c1, c2;
    13 vector< pair<int, int> > E[N];
    14 
    15 void dijkstra() {
    16     priority_queue< pair<int, int> > Q;
    17     Q.push( make_pair(0, c1) );
    18     memset(d, 0x3f, sizeof(d));
    19     d[c1] = 0; cnt[c1] = 1; sum[c1] = a[c1];
    20     while(!Q.empty()) {
    21         int u = Q.top().second;
    22         Q.pop();
    23         if(vis[u]) continue;
    24         vis[u] = 1;
    25         for(int i = 0; i < E[u].size(); i++) {
    26             int v = E[u][i].first;
    27             int w = E[u][i].second;
    28             if(d[v] > d[u] + w) {
    29                 d[v] = d[u] + w;
    30                 cnt[v] = cnt[u];
    31                 sum[v] = sum[u] + a[v];
    32                 Q.push( make_pair(-d[v], v) );
    33             }
    34             else if(d[v] == d[u] + w) {
    35                 cnt[v] += cnt[u];
    36                 sum[v] = max(sum[v], sum[u] + a[v]);
    37                 Q.push( make_pair(-d[v], v) );
    38             }
    39         }
    40     }
    41 
    42 }
    43 
    44 int main() {
    45     scanf("%d %d %d %d", &n, &m, &c1, &c2);
    46     for(int i = 0; i < n; i++) {
    47         scanf("%d", &a[i]);
    48     }
    49     for(int i = 1; i <= m; i++) {
    50         int u, v, w;
    51         scanf("%d %d %d", &u, &v, &w);
    52         E[u].push_back(make_pair(v, w));
    53         E[v].push_back(make_pair(u, w));
    54     }
    55     dijkstra();
    56     printf("%d %d", cnt[c2], sum[c2]);
    57     return 0;
    58 }
    View Code

    1004 Counting Leaves 

    遍历树,在每个深度纪录下答案。

     
     1 #include <vector>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N=123;
     9 vector<int> E[N];
    10 int ans[N], mx = 0;
    11 
    12 void dfs(int u, int fa, int level) {
    13     if(E[u].size()==0) {
    14         mx = max(mx, level);
    15         ans[level]++;
    16         return ;
    17     }
    18     for(int i = 0; i < E[u].size(); i++){
    19         int v = E[u][i];
    20         if(v != fa) dfs(v, u, level + 1);
    21     }
    22 }
    23 
    24 int main() {
    25     int n, m;
    26     scanf("%d %d", &n, &m);
    27     for(int i = 1; i <= m; i++) {
    28         int u, v, k;
    29         scanf("%d %d", &u, &k);
    30         for(int j = 1; j <= k; j++) {
    31             scanf("%d", &v);
    32             E[u].push_back(v);
    33         }
    34     }
    35     dfs(1, 0, 1);
    36     printf("%d", ans[1]);
    37     for(int i = 2; i <= mx; i++){
    38         printf(" %d", ans[i]);
    39     }
    40     return 0;
    41 }
    View Code

    1005 Spell It Right

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

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 string s;
     6 string str[10]={"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
     7 int ans[123];
     8 
     9 int main() {
    10     int num = 0, cnt = 0;
    11     cin >> s;
    12     for(int i = 0; i < s.size(); i++) {
    13         num = num + (s[i] - '0');
    14     }
    15     if(num == 0) {
    16         cout << str[0];
    17         return 0;
    18     }
    19     while(num) {
    20         ans[cnt++] = num % 10;
    21         num /= 10;
    22     }
    23     for(int i = cnt - 1; i >= 0 ; i--){
    24         cout << str[ ans[i] ] ;
    25         if(i != 0) cout << " " ;
    26     }
    27     return 0;
    28 }
    View Code

    1006 Sign In and Sign Out

    直接把时间转成数字,大小比较,更新答案。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int INF = 0x3f3f3f3f;
     7 char s[20], ans1[20], ans2[20];
     8 
     9 int main() {
    10     int n, mi = INF, mx = 0;
    11     scanf("%d", &n);
    12     for(int i = 1; i <= n; i++) {
    13         int a, b, c, d, e, f;
    14         scanf("%s %d:%d:%d %d:%d:%d", s, &a, &b, &c, &d, &e, &f);
    15         a = a * 10000 + b * 100 + c;
    16         d = d * 10000 + e * 100 + f;
    17         if(a < mi) {
    18             mi = a;
    19             strcpy(ans1, s);
    20         }
    21         if(d > mx) {
    22             mx =d;
    23             strcpy(ans2, s);
    24         }
    25     }
    26     printf("%s %s", ans1, ans2);
    27     return 0;
    28 }
    View Code

    1007 Maximum Subsequence Sum

    最大子段和,动态规划的一个想法。一直累加,加到小于0,重置为0,从下个开始重新加。

    注意坑点:全负输出最前面和最后面的数字;数字全部<=0,并至少有一个0,输出0 0 0。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 typedef long long ll;
     8 const int N = 1e4 + 10;
     9 ll a[N];
    10 
    11 int main() {
    12     ll k,  l, r, ans = 0, sum = 0;
    13     scanf("%lld", &k);
    14     for(int i = 1; i <= k; i++) {
    15         scanf("%lld", &a[i]);
    16     }
    17     l = a[1]; r = a[k];
    18     for(int i = 1; i <= k; i++) {
    19         sum += a[i];
    20         if(sum < 0) sum = 0;
    21         if(sum > ans) {
    22             ans = sum;
    23             r = a[i];
    24         }
    25     }
    26     if(ans == 0) {
    27         for(int i = 1; i <= k; i++) {
    28             if(a[i] == 0) {
    29                 //-1 0 -1
    30                 printf("0 0 0");
    31                 return 0;
    32             }
    33         }
    34         //-1 -1 -1
    35         printf("%lld %lld %lld", ans, l, r);
    36         return 0;
    37     }
    38     for(int i = 1; i <= k; i++) {
    39         if(a[i] == r) {
    40             sum = 0;
    41             for(int j = i; j >= 1; j--) {
    42                 sum += a[j];
    43                 if(sum == ans) {
    44                     l = a[j];
    45                     printf("%lld %lld %lld", ans, l, r);
    46                     return 0;
    47                 }
    48             }
    49         }
    50     }
    51     return 0;
    52 }
    View Code

    1008 Elevator

    模拟一下就好了。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 int main() {
     8     int n, k, keep = 0, ans = 0;
     9     scanf("%d", &n);
    10     for(int i = 1; i <= n; i++) {
    11         scanf("%d", &k);
    12         if( k > keep) {
    13             ans += 6 * (k - keep);
    14         } else {
    15             ans += 4 * (keep - k);
    16         }
    17         ans += 5;
    18         keep = k;
    19     }
    20     printf("%d", ans);
    21     return 0;
    22 }
    View Code

    1009 Product of Polynomials

    按照要求算出多项式,用map存下。多项式的系数可能为负。

     1 #include <map>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N = 15;
     9 int a[N];
    10 double b[N];
    11 map<int, double> m;
    12 
    13 int main() {
    14     int k, c, mx = 0, cnt = 0;
    15     double d;
    16     scanf("%d", &k);
    17     for(int i = 1; i <= k; i++) {
    18         scanf("%d %lf", &a[i], &b[i]);
    19     }
    20     scanf("%d",&k);
    21     for(int i = 1; i <= k; i++) {
    22         scanf("%d %lf", &c, &d);
    23         for(int j = 1; j <= k; j++) {
    24             mx = max(mx, c + a[j]);
    25             m[(c + a[j])] += b[j] * d;
    26         }
    27     }
    28     for(int i = 0; i <= mx; i++) {
    29         if(m[i] != 0) cnt++;
    30     }
    31     printf("%d",cnt);
    32     for(int i = mx; i >= 0 ; i--) {
    33         if(m[i] != 0) printf(" %d %.1f", i, m[i]);
    34     }
    35     return 0;
    36 }
    View Code

    1010 Radix 

    先把要判断的数,和另一个数每位上的数字处理出来,然后二分答案。右边界要开到$3*10^9$左右。这精度卡的真严谨呀。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 typedef long long ll;
     8 string s1, s2;
     9 ll tag, radix, n1, n2;
    10 ll a[15], num = 0, k = 1, l = 0, r = 3e9, ans = 1e18;
    11 
    12 bool check(ll mid) {
    13     ll res = 0, tmp = 1;
    14     for(int i = n2 - 1; i >= 0; i--) {
    15         res = res + a[i] * tmp;
    16         tmp *= mid;
    17     }
    18     if(res == num) ans = min(ans, mid);
    19     if(res >= num || res < 0) return true;
    20     else return false;
    21 }
    22 
    23 int main() {
    24     cin >> s1 >> s2 >> tag >> radix;
    25     n1 = s1.size(); n2 = s2.size();
    26 
    27     if(tag == 2) {
    28         swap(s1, s2); swap(n1, n2);
    29     }
    30 
    31     for(int i = n1 - 1; i >= 0; i--) {
    32         if(s1[i] >= 'a' && s1[i] <= 'z') {
    33             num = num + ( (s1[i] - 'a') + 10 ) * k;
    34         } else {
    35             num = num + (s1[i] - '0') * k;
    36         }
    37         k *= radix;
    38     }
    39     for(int i = n2 - 1; i >= 0; i--) {
    40         if(s2[i] >= 'a' && s2[i] <= 'z') {
    41             a[i] = 1LL * ( (s2[i] - 'a') + 10 );
    42         } else {
    43             a[i] = 1LL * (s2[i] - '0');
    44         }
    45         l = max(l, a[i] + 1);
    46     }
    47     while(l <= r) {
    48         ll mid = (l + r) /2;
    49         if(check(mid)) r = mid - 1;
    50         else l = mid + 1;
    51     }
    52     if(ans == 1e18) cout << "Impossible";
    53     else cout << ans;
    54     return 0;
    55 }
    View Code

    1011 World Cup Betting

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

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 char ans[10];
     7 
     8 int main() {
     9     double a, b, c, res = 0.65;
    10     for(int i = 1; i <= 3; i++) {
    11         scanf("%lf %lf %lf", &a, &b, &c);
    12         if(a >= b && a >= c) ans[i] = 'W', res *= a;
    13         else if(b >= a && b >= c) ans[i] = 'T', res *= b;
    14         else if(c >= a && c >= b) ans[i] = 'L', res *= c;
    15     }
    16     res = (res - 1) * 2;
    17     for(int i = 1; i <= 3; i++) printf("%c ", ans[i]);
    18     printf("%.2f", res);
    19     return 0;
    20 }
    View Code

    1012 The Best Rank

    结构体排序。按题目需要的优先级排序,记录下。判断的时候也按照要求的优先级判断,更新答案。注意存等级顺序的时候,相同分数的应排在同一等级。

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int N = 1e6;
     7 const int INF = 0x3f3f3f3f;
     8 struct node {
     9     int id, c, m, e, a;
    10 }s[N];
    11 int A[N], C[N], M[N], E[N];
    12 
    13 bool cmpa(node s1, node s2) {
    14     if(s1.a == s2.a) return s1.id < s2.id;
    15     return s1.a > s2.a;
    16 }
    17 
    18 bool cmpc(node s1, node s2) {
    19     if(s1.c == s2.c) return s1.id < s2.id;
    20     return s1.c > s2.c;
    21 }
    22 
    23 bool cmpm(node s1, node s2) {
    24     if(s1.m == s2.m) return s1.id < s2.id;
    25     return s1.m > s2.m;
    26 }
    27 
    28 bool cmpe(node s1, node s2) {
    29     if(s1.e == s2.e) return s1.id < s2.id;
    30     return s1.e > s2.e;
    31 }
    32 
    33 int main() {
    34     int n, m, id;
    35     scanf("%d %d", &n, &m);
    36     for(int i = 1; i <= n; i++) {
    37         scanf("%d %d %d %d", &s[i].id, &s[i].c, &s[i].m, &s[i].e);
    38         s[i].a = (s[i].c + s[i].m + s[i].e);
    39     }
    40     sort(s + 1, s + 1 + n, cmpa);
    41     for(int i = 1; i <= n; i++) {
    42         if(s[i].a == s[i-1].a) A[s[i].id] = A[ s[i - 1].id ];
    43         else A[s[i].id] = i;
    44     }
    45     sort(s + 1, s + 1 + n, cmpc);
    46     for(int i = 1; i <= n; i++) {
    47         if(s[i].c == s[i-1].c) C[s[i].id] = C[ s[i - 1].id ];
    48         else C[s[i].id] = i;
    49     }
    50     sort(s + 1, s + 1 + n, cmpm);
    51     for(int i = 1; i <= n; i++) {
    52         if(s[i].m == s[i-1].m) M[s[i].id] = M[ s[i - 1].id ];
    53         else M[s[i].id] = i;
    54     }
    55     sort(s + 1, s + 1 + n, cmpe);
    56     for(int i = 1; i <= n; i++) {
    57         if(s[i].e == s[i-1].e) E[s[i].id] = E[ s[i - 1].id ];
    58         else E[s[i].id] = i;
    59     }
    60     for(int i = 1; i <= m; i++) {
    61         int level = INF;
    62         char ans;
    63         scanf("%d", &id);
    64         if(A[id] != 0 && A[id] < level) level = A[id], ans = 'A';
    65         if(C[id] != 0 && C[id] < level) level = C[id], ans = 'C';
    66         if(M[id] != 0 && M[id] < level) level = M[id], ans = 'M';
    67         if(E[id] != 0 && E[id] < level) level = E[id], ans = 'E';
    68         if(level == INF) printf("N/A
    ");
    69         else printf("%d %c
    ", level, ans);
    70     }
    71     return 0;
    72 }
    View Code

    1013 Battle Over Cities

    考虑某个顶点(k)被占领,那么我们需要把剩余的城市连接起来(这时候不考虑那些和顶点k连接的线),假设剩余的城市形成了m个集合(每个集合内的点都是连通的),我们需要m-1条边连接它们。

    (代码中的cnt-2,是计算的时候把顶点k也单独看成一个集合,但是这个点不需要计算,所以再cnt-1的基础上再减去1)

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int N = 1234;
     8 int fa[N], u[N * N], v[N * N];
     9 
    10 int fi(int x) {
    11     return x == fa[x] ? x : fa[x] = fi(fa[x]);
    12 }
    13 
    14 void Union(int x, int y) {
    15     int fx = fi(x), fy = fi(y);
    16     if(fx != fy) {
    17         fa[fx] = fy;
    18     }
    19 }
    20 
    21 int main() {
    22     int n, m, k, p;
    23     scanf("%d %d %d", &n, &m, &k);
    24     for(int i = 1; i <= m; i++) {
    25         scanf("%d %d", &u[i], &v[i]);
    26     }
    27     for(int i = 1; i <= k; i++) {
    28         int cnt = 0;
    29         scanf("%d", &p);
    30         for(int j = 1; j <= n; j++) fa[j] = j;
    31         for(int j = 1; j <= m; j++) {
    32             if(u[j] == p || v[j] == p) continue;
    33             else Union(u[j], v[j]);
    34         }
    35         for(int j = 1; j <= n; j++) {
    36             if(fa[j] == j) cnt++;
    37         }
    38         printf("%d
    ", cnt - 2);
    39     }
    40     return 0;
    41 }
    View Code

    1014 Waiting in Line

    队列模拟下。注意能够在17:00之前被服务到的,不管他需要办理业务多长时间,都是能够有答案的。

     1 #include <queue>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N = 1234;
     9 queue<int> window[N];
    10 int ans1[N], ans2[N], t[N];
    11 
    12 int main() {
    13     int n, m, k, q, time;
    14     scanf("%d %d %d %d", &n, &m, &k, &q);
    15     for(int i = 1; i <= k; i++) {
    16         int pos = 1;
    17         scanf("%d", &time);
    18         for(int j = 1; j <= n; j++) {
    19             if(i <= n * m) {
    20                 if(window[j].size() < window[pos].size()) pos = j;
    21             } else {
    22                 if(window[j].front() < window[pos].front()) pos = j;
    23             }
    24         }
    25         t[pos] += time;
    26         window[pos].push(t[pos]);
    27         if(i > n * m) window[pos].pop();
    28         if(t[pos] - time < 540) ans1[i] = 8 + t[pos] / 60, ans2[i] = t[pos] % 60;
    29         else ans1[i] = -1;
    30     }
    31     for(int i = 1; i <= q; i++) {
    32         int pos;
    33         scanf("%d", &pos);
    34         if(ans1[pos] == -1) printf("Sorry
    ");
    35         else printf("%02d:%02d
    ", ans1[pos], ans2[pos]);
    36     }
    37     return 0;
    38 }
    View Code

    1015 Reversible Primes

    把原来的数转换成对应进制下的逆反数。再对原来的数和逆反数进行素数判断。比如23在2进制下为10111,逆反数为11101,再转换成10进制为29。

     1 #include <cstdio>
     2 #include <iostream>
     3 using namespace std;
     4 
     5 int Reverse(int n, int d) {
     6     int res = 0;
     7     while(n) {
     8         res = res * d + n % d;
     9         n /= d;
    10     }
    11     return res;
    12 }
    13 
    14 bool Check(int k) {
    15     if(k <= 1) return false;
    16     for(int i = 2; i * i <= k; i++) {
    17         if(k % i == 0) return false;
    18     }
    19     return true;
    20 }
    21 
    22 int main() {
    23     int n, d;
    24     while(scanf("%d", &n) != EOF && n >= 0) {
    25         scanf("%d", &d);
    26         if(Check(n) && Check( Reverse(n, d) )) {
    27             printf("Yes
    ");
    28         } else {
    29             printf("No
    ");
    30         }
    31     }
    32     return 0;
    33 }
    View Code

    1016 Phone Bills

    注意题目中给的24小时的花费是 分/分钟。所有记录放进结构体中,按优先级大小 名字的字典序 > 时间排序,因为题目中时间的唯一性和时间都是按开始到结束排序的,那么前后分别为on和off的必然是合法数据。排序完后再映射到每个人去(参考了柳神的做法,感觉很巧妙),接着计算差值,按照要求输出。

     1 #include <map>
     2 #include <vector>
     3 #include <cstdio>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 int cost[25];
     9 struct node{
    10     string name;
    11     int time, month, day, hour, minute, stuate, status;
    12 }rcd[1234];
    13 map<string, vector<node> > customer;
    14 
    15 bool cmp(node x, node y) {
    16     if(x.name == y.name) return x.time < y.time;
    17     return x.name < y.name;
    18 }
    19 
    20 int main() {
    21     int n;
    22     for(int i = 0; i < 24; i++) scanf("%d", &cost[i]), cost[24] += cost[i];
    23     scanf("%d", &n);
    24     for(int i = 1; i <= n; i++) {
    25         string str;
    26         cin >> rcd[i].name;
    27         scanf("%d:%d:%d:%d", &rcd[i].month, &rcd[i].day, &rcd[i].hour, &rcd[i].minute);
    28         cin >> str;
    29         if(str == "on-line") rcd[i].status = 1;
    30         else rcd[i].status = 0;
    31         rcd[i].time = rcd[i].day * 24 * 60 + rcd[i].hour * 60 + rcd[i].minute;
    32     }
    33     sort(rcd + 1, rcd + 1 + n, cmp);
    34     for(int i = 1; i <= n; i++) {
    35         if(rcd[i - 1].name == rcd[i].name && rcd[i - 1].status == 1 && rcd[i].status == 0) {
    36             customer[rcd[i].name].push_back(rcd[i - 1]);
    37             customer[rcd[i].name].push_back(rcd[i]);
    38         }
    39     }
    40     for(auto p : customer) {
    41         double res = 0;
    42         vector <node> date = p.second;
    43         cout << p.first << " ";
    44         printf("%02d
    ", date[0].month);
    45         for(int i = 0; i < date.size(); i += 2) {
    46             printf("%02d:%02d:%02d ", date[i].day, date[i].hour, date[i].minute);
    47             printf("%02d:%02d:%02d ", date[i + 1].day, date[i + 1].hour, date[i + 1].minute);
    48             double c1 = 0, c2 = 0;
    49             for(int j = 0; j < 24; j++) {
    50                 if(j < date[i].hour) {
    51                     c1 += cost[j] * 60;
    52                 } else if(j == date[i].hour) {
    53                     c1 += date[i].day * cost[24] * 60 + 1.0 * date[i].minute * cost[j];
    54                 }
    55             }
    56             for(int j = 0; j < 24; j++) {
    57                 if(j < date[i + 1].hour) {
    58                     c2 += cost[j] * 60;
    59                 } else if(j == date[i + 1].hour) {
    60                     c2 += date[i + 1].day * cost[24] * 60+ 1.0 * date[i + 1].minute * cost[j];
    61                 }
    62             }
    63             printf("%d $%.2f
    ", date[i + 1].time - date[i].time, (c2 - c1) / 100);
    64             res += (c2 - c1) / 100;
    65         }
    66         printf("Total amount: $%.2f
    ", res);
    67     }
    68 
    69     return 0;
    70 }
    View Code

    1017 Queueing at Bank 

    直接模拟。每个窗口遍历一下,找到时间最前的窗口,维护下每个窗口的时间。这题和1014很像,但是有一个区别,1014题目中说的是17:00之前(包括17:00)服务得到就服务,这题是只要你17:00之前(包括17:00)到达银行,那你就能被服务,不用管你是不是在17:00后服务的。(这个就是最后一个点的trick)(还是要仔细看题呀)。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int N = 1e4 + 10;
     8 const int INF = 0x3f3f3f3f;
     9 
    10 int t[N];
    11 struct node{
    12     int time, cost;
    13 }p[N];
    14 
    15 bool cmp(node x, node y) {
    16     return x.time < y.time;
    17 }
    18 
    19 int main(){
    20     int n, k, cnt = 0;
    21     double ans = 0;
    22     scanf("%d %d", &n, &k);
    23     for(int i = 1; i <= n; i++) {
    24         int hh, mm, ss;
    25         scanf("%d:%d:%d %d", &hh, &mm, &ss, &p[i].cost);
    26         p[i].time = 3600 * hh + 60 * mm + ss;
    27         p[i].cost *= 60;
    28     }
    29     sort(p + 1, p + 1 + n, cmp);
    30     for(int i = 1; i <= k; i++) t[i] = 8 * 3600;
    31     for(int i = 1; i <= n; i++) {
    32         if(p[i].time > 17 * 3600) break;
    33         int pos = 1;
    34         for(int j = 1; j <= k; j++) {
    35             if(t[pos] > t[j]) pos = j;
    36         }
    37         if(p[i].time > t[pos]) {
    38             t[pos] = p[i].time;
    39         } else {
    40             ans += 1.0 * (t[pos] - p[i].time);
    41         }
    42         t[pos] += p[i].cost;
    43         cnt++;
    44     }
    45     printf("%.1f
    ", ans/60.0/cnt);
    46     return 0;
    47 }
    View Code

    1018 Public Bike Management

    一开始我用dijkstra,一直有几个点过不去。去看了下网上的题解,发现这题数据不大可以直接用暴力DFS+剪枝过。到达终点,判断的条件需要满足最短路条件,先满足从0点拿出最少,然后满足送回0点最少。

    判断顺序需要注意。还有就是DFS的时候需要回溯,标记打完记得消除。

     1 #include <vector>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 555;
     9 const int INF = 0x3f3f3f3f;
    10 bool vis[maxn];
    11 int c[maxn], d[maxn];
    12 int Cmax, N, Sp, M;
    13 ///take 拿去;bring 带回
    14 int sum = 0, take = 0, bring = 0;
    15 int ans_sum = INF, ans_take = INF, ans_bring = INF;
    16 vector<int> path;
    17 vector<int> ans_path;
    18 vector< pair<int,int> > E[maxn];
    19 
    20 void dfs(int u) {
    21     if(ans_sum < sum ) return ;
    22     if(u == Sp) {
    23         if(ans_sum > sum) {
    24             ans_sum = sum;
    25             ans_bring = bring;
    26             ans_take = take;
    27             ans_path = path;
    28         } else {
    29             if(ans_take > take || (ans_take == take && (ans_bring > bring) )) {
    30                 ans_bring = bring;
    31                 ans_take = take;
    32                 ans_path = path;
    33             }
    34         }
    35         return ;
    36     }
    37     for(int i = 0; i < E[u].size(); i++) {
    38         int v = E[u][i].first;
    39         int dis = E[u][i].second;
    40         int tmp_sum = sum, tmp_bring = bring, tmp_take = take;
    41         if(!vis[v] && d[v] >= d[u] + dis) {
    42             vis[v] = 1;
    43             sum += dis;
    44             bring += (c[v] - Cmax / 2);
    45             if(bring < 0) take -= bring, bring = 0;
    46             path.push_back(v);
    47             d[v] = d[u] + dis;
    48             dfs(v);
    49             vis[v] = 0;
    50             sum = tmp_sum;
    51             bring = tmp_bring;
    52             take = tmp_take;
    53             path.pop_back();
    54         }
    55     }
    56 
    57 }
    58 
    59 int main(){
    60     scanf("%d%d%d%d", &Cmax, &N, &Sp, &M);
    61     for(int i = 1; i <= N; i++) {
    62         scanf("%d", &c[i]);
    63     }
    64     for(int i = 1; i <= M; i++) {
    65         int u, v, w;
    66         scanf("%d %d %d", &u, &v, &w);
    67         E[u].push_back(make_pair(v, w));
    68         E[v].push_back(make_pair(u, w));
    69     }
    70     for(int i = 0; i< maxn; i++) d[i] = INF;
    71     d[0] = 0; vis[0] = 1;
    72     dfs(0);
    73     printf("%d 0", ans_take);
    74     for(int i = 0; i < ans_path.size(); i++) {
    75         printf("->%d", ans_path[i]);
    76     }
    77     printf(" %d",ans_bring);
    78     return 0;
    79 }
    View Code

    1019 General Palindromic Number

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

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 int a[50];
     6 
     7 int main() {
     8     bool f = 1;
     9     int n, m, cnt = 0;
    10     cin >> n >> m;
    11     while(n) {
    12         a[++cnt] = n % m;
    13         n /= m;
    14     }
    15     for(int i = 1; i <= cnt / 2; i++) {
    16         if(a[i] != a[cnt - i + 1]) {
    17             f = 0;
    18             break;
    19         }
    20     }
    21     if(f) printf("Yes
    ");
    22     else printf("No
    ");
    23     for(int i = cnt; i >= 1; i--) {
    24         printf("%d", a[i]);
    25         if(i != 1) printf(" ");
    26     }
    27     return 0;
    28 }
    View Code

    1020 Tree Traversals 

    前序遍历:根左右;中序遍历:左根右;后序遍历:左右根。

    该题知道中序遍历和后序遍历,求层序遍历。 由后序遍历我们可以知道根节点。根据得到的根节点,去中序遍历中找到对应位置,该位置左边的就为左子树的顶点,右边的为右子树的顶点,根据长度我们可以同时在后序遍历中找到对应段。一直搜索下去,直到叶子节点,没有子树的设置-1。

     1 #include <queue>
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int N = 1e7 + 10;
     8 int post[33], in[33];
     9 int node[N];
    10 
    11 // l1 r1 后序; l2 r2 中序
    12 void restore(int l1, int r1, int l2, int r2, int id) {
    13     if(l1 > r1) {
    14         node[id] = -1;
    15         return ;
    16     }
    17     node[id] = post[r1];
    18     for(int i = l2; i <= r2; i++) {
    19         if(in[i] == node[id]) {
    20             int len = i - l2;
    21             restore(l1, l1 + len -1, l2, i - 1, 2 * id);
    22             restore(l1 + len, r1 - 1, i + 1, r2, 2 * id + 1);
    23         }
    24     }
    25 }
    26 
    27 int main() {
    28     int n;
    29     cin >> n;
    30     for(int i = 1; i <= n; i++) cin >> post[i];
    31     for(int i = 1; i <= n; i++) cin >> in[i];
    32     restore(1, n, 1, n, 1);
    33     queue <int> Q;
    34     Q.push(1);
    35     while(!Q.empty()) {
    36         int u = Q.front();
    37         Q.pop();
    38         if(node[2 * u] != -1) Q.push(2 * u);
    39         if(node[2 * u + 1] != -1) Q.push(2 * u + 1);
    40         if(u != 1) cout << " ";
    41         if(node[u] != -1) cout << node[u];
    42     }
    43     return 0;
    44 }
    View Code

     

    1021 Deepest Root

    先并查集判断下是不是树。DFS暴力跑每个顶点,求每个顶点能跑最远的距离。本来以为还要剪枝,做下标记什么的,没想到暴力一跑,A了。(数据可能比较水,暴力的时间复杂度达到O(n^2))

     1 #include <vector>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N = 1e4 + 10;
     9 int fa[N], d[N];
    10 vector <int> E[N];
    11 
    12 int fi(int x) {
    13     return x == fa[x] ? fa[x] : fa[x] = fi(fa[x]);
    14 }
    15 
    16 void Union(int x, int y) {
    17     int fx = fi(x), fy = fi(y);
    18     if(fx != fy) {
    19         fa[fx] = fy;
    20     }
    21 }
    22 
    23 void dfs(int st, int u, int F, int deep) {
    24     d[st] = max(d[st], deep);
    25     for(int i = 0; i < E[u].size(); i++) {
    26         int v = E[u][i];
    27         if(v != F) dfs(st, v, u, deep + 1);
    28     }
    29 }
    30 
    31 int main() {
    32     int n, cnt = 0;
    33     scanf("%d", &n);
    34     for(int i = 1; i <= n; i++) fa[i] = i;
    35     for(int i = 1; i < n; i++){
    36         int u, v;
    37         scanf("%d %d", &u, &v);
    38         E[u].push_back(v);
    39         E[v].push_back(u);
    40         Union(u, v);
    41     }
    42     for(int i = 1; i <= n; i++) {
    43         if(i == fa[i]) cnt++;
    44     }
    45     if(cnt > 1) {
    46         printf("Error: %d components", cnt);
    47     } else {
    48         int mx = 0;
    49         for(int i = 1;i <= n; i++) {
    50             dfs(i, i, -1, 1);
    51             mx = max(mx, d[i]);
    52         }
    53         for(int i = 1; i <= n; i++) {
    54             if(d[i] == mx) printf("%d
    ", i);
    55         }
    56     }
    57 
    58     return 0;
    59 }
    View Code

    1022 Digital Library 

    这题就用map搞下就好了。本来想用hash,搞了一个多小时,一直过不了,就放弃了。注意输出ID的时候用%7d,一直没注意,卡了挺久的。

     1 #include <set>
     2 #include <map>
     3 #include <cstdio>
     4 #include <iostream>
     5 using namespace std;
     6 
     7 
     8 string s;
     9 map <string, set<int> > mp[10];
    10 
    11 int main() {
    12     int n, m, id, pos;
    13     cin >> n;
    14     for(int i = 1; i <= n; i++) {
    15         cin >> id;
    16         getchar();
    17         for(int j = 1; j <= 5; j++) {
    18             if(j == 3) {
    19                 while(cin >> s) {
    20                     mp[j][s].insert(id);
    21                     char c = getchar();
    22                     if(c == '
    ') break;
    23                 }
    24                 continue;
    25             }
    26             getline(cin, s);
    27             mp[j][s].insert(id);
    28         }
    29     }
    30     cin >> m;
    31     for(int i = 1; i <= m; i++) {
    32         char c;
    33         cin >> pos >> c;
    34         getchar();
    35         getline(cin, s);
    36         cout << pos << ": " << s << endl;
    37         if(mp[pos].find(s) != mp[pos].end()) {
    38             for(auto it : mp[pos][s]) printf("%07d
    ", it);
    39         } else {
    40             printf("Not Found
    ");
    41         }
    42     }
    43     return 0;
    44 }
    View Code

    1023 Have Fun with Numbers

    把2倍的计算出来与原来的比较一下。字符串存,no的时候也要输出字符串。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 char s1[25], s2[25], ans[25];
     8 
     9 int main() {
    10     int val, cnt = 0;
    11     scanf("%s", s1 + 1);
    12     int len = strlen(s1 + 1);
    13     for(int i = len; i >= 1; i--) {
    14         val = 2 * (s1[i] - '0') + cnt;
    15         cnt = 0;
    16         if(val >= 10) val -= 10, cnt++;
    17         s2[i] = (val + '0'); ans[i] = s2[i];
    18     }
    19     sort(s1 + 1, s1 + 1 + len);
    20     sort(s2 + 1, s2 + 1 + len);
    21     for(int  i = 1; i <= len; i++) {
    22         if(s1[i] != s2[i]) {
    23             printf("No
    ");
    24             if(cnt > 0) printf("1%s", ans + 1);
    25             else printf("%s", ans + 1);
    26             return 0;
    27         }
    28     }
    29     printf("Yes
    ");
    30     printf("%s", ans + 1);
    31     return 0;
    32 }
    View Code

    1024 Palindromic Number

    考虑下最大能变成多少,每次加上翻转后的数,看成每次乘上2,那么最大的数会变成$10^10 * 2^100$。long long会爆,用string存。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 typedef long long ll;
     8 
     9 bool check(string n) {
    10     for(int i = 0, j = n.size() - 1; i < j; i++, j--) {
    11         if(n[i] != n[j]) return false;
    12     }
    13     return true;
    14 }
    15 
    16 string cal(string n) {
    17     string m = n, res = "";
    18     reverse(n.begin(), n.end());
    19     int cnt = 0;
    20     for(int i = m.size() - 1; i >= 0; i--) {
    21         int d = (m[i] - '0') + (n[i] - '0') + cnt;
    22         cnt = 0;
    23         if(d >= 10) d -= 10, cnt++;
    24         char c = d + '0';
    25         res = c + res;
    26     }
    27     if(cnt > 0) res = "1" + res;
    28     return res;
    29 }
    30 
    31 int main() {
    32     int k;
    33     string n;
    34     cin >> n >> k;
    35     for(int i = 1; i <= k; i++) {
    36         if(check(n)) {
    37             cout << n << endl << i - 1 << endl;
    38             return 0;
    39         }
    40         n = cal(n);
    41     }
    42     cout << n << endl << k << endl;
    43     return 0;
    44 }
    View Code

    1025 PAT Ranking

    结构体排序。部分先排,再全部排序。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 typedef long long ll;
     8 const int N = 30000 +10;
     9 struct node {
    10     ll id;
    11     int grade, fin, loc_num, loc_rank;
    12 }p[N];
    13 
    14 bool cmp(node x, node y) {
    15     if(x.grade == y.grade) return x.id < y.id;
    16     return x.grade > y.grade;
    17 }
    18 
    19 int main() {
    20     int n, m, cnt = 0;
    21     scanf("%d", &n);
    22     for(int i = 1; i <= n; i++) {
    23         scanf("%d", &m);
    24         for(int j = 0; j < m; j++) {
    25             scanf("%lld %d", &p[cnt + j].id, &p[cnt + j].grade);
    26             p[cnt + j].loc_num = i;
    27         }
    28         sort(p + cnt, p + cnt + m, cmp);
    29         p[cnt].loc_rank = 1;
    30         for(int j = 1; j < m; j++) {
    31             if(p[cnt + j].grade == p[cnt + j - 1].grade) {
    32                 p[cnt + j].loc_rank = p[cnt + j - 1].loc_rank;
    33             } else {
    34                 p[cnt + j].loc_rank = j + 1;
    35             }
    36         }
    37         cnt += m;
    38     }
    39     sort(p, p + cnt, cmp);
    40     printf("%d
    ", cnt);
    41     for(int i = 0; i < cnt; i++) {
    42         if(i == 0 || p[i].grade != p[i - 1].grade) {
    43             p[i].fin = i + 1;
    44         } else {
    45             p[i].fin = p[i - 1].fin;
    46         }
    47         printf("%013lld %d %d %d
    ", p[i].id, p[i].fin, p[i].loc_num, p[i].loc_rank);
    48     }
    49     return 0;
    50 }
    View Code

    1027 Colors in Mars

    进制转换

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 int c[4];
     8 
     9 void solve(int v) {
    10     char c1, c2;
    11     int a1 = v / 13, a2 = v % 13;
    12     if(a1 > 9) c1 = 'A' + (a1 - 10);
    13     else c1 = '0' + a1;
    14     if(a2 > 9) c2 = 'A' + (a2 - 10);
    15     else c2 = '0' + a2;
    16     cout << c1 << c2;
    17 }
    18 
    19 int main() {
    20     for(int i = 1; i <= 3; i++) cin >> c[i];
    21     cout << "#";
    22     for(int i = 1; i <= 3; i++) solve(c[i]);
    23     return 0;
    24 }
    View Code

    1028 List Sorting

    结构体排序,strcmp函数。(这个函数都快忘记了,-_-||)

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int N = 1e5 + 10;
     8 struct node {
     9     int id, grade;
    10     char name[10];
    11 }p[N];
    12 
    13 bool cmp1(node x, node y) {
    14     return x.id < y.id;
    15 }
    16 
    17 bool cmp2(node x, node y) {
    18     if( strcmp(x.name, y.name) == 0) {
    19         return x.id < y.id;
    20     }
    21     return strcmp(x.name, y.name) < 0;
    22 }
    23 
    24 bool cmp3(node x, node y) {
    25     if(x.grade == y.grade) {
    26         return x.id < y.id;
    27     }
    28     return x.grade < y.grade;
    29 }
    30 
    31 int main() {
    32     int n, k;
    33     scanf("%d %d", &n, &k);
    34     for(int i = 1; i <= n; i++) {
    35         scanf("%d %s %d", &p[i].id, &p[i].name, &p[i].grade);
    36     }
    37     if(k == 1) {
    38         sort(p + 1, p + 1 + n, cmp1);
    39     }
    40     else if(k == 2){
    41         sort(p + 1, p + 1 + n, cmp2);
    42     } else {
    43         sort(p + 1, p + 1 + n, cmp3);
    44     }
    45     for(int i = 1; i <= n; i++) {
    46         printf("%06d %s %d
    ", p[i].id, p[i].name, p[i].grade);
    47     }
    48     return 0;
    49 }
    View Code

    1029 Median

    最后一组卡内存。确定位置$(n+m+1)/2$,输入m个数字的同时,通过与之前输入的n个数字比较,用一个下标不断逼近位置。

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int N = 2e5 + 5;
     7 int a[N];
     8 
     9 int main() {
    10     int n, m, num;
    11     scanf("%d", &n);
    12     for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    13     scanf("%d", &m);
    14     int id = 1, cnt = 0;
    15     int mid = (n + m + 1) / 2;
    16     for(int i = 1; i <= m; i++) {
    17         scanf("%d", &num);
    18         while(id <= n && num > a[id]) {
    19             cnt++;
    20             if(cnt == mid) {printf("%d", a[id]); return 0;}
    21             id++;
    22         }
    23         cnt++;
    24         if(cnt == mid) {printf("%d", num); return 0;}
    25     }
    26     while(cnt < mid && id < n) {
    27         cnt++;
    28         if(cnt == mid) {printf("%d", a[id]); return 0;}
    29         id++;
    30     }
    31     return 0;
    32 }
    View Code

    1030 Travel Plan

    最短路套路题+遍历路径。

     1 #include <queue>
     2 #include <vector>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <iostream>
     6 #include <algorithm>
     7 using namespace std;
     8 
     9 const int N = 500 + 10;
    10 bool vis[N];
    11 int sum[N], d[N], pre[N];
    12 int n, m, c1, c2;
    13 
    14 struct edge{
    15     int u, v, dis, cost;
    16 };
    17 
    18 struct node{
    19     int u, dis;
    20     friend bool operator < (node a, node b) {
    21         return a.dis > b.dis;
    22     }
    23 };
    24 
    25 vector<edge> E[N];
    26 
    27 void dijkstra() {
    28     priority_queue<node> Q;
    29     Q.push(node{c1, 0});
    30     memset(d, 0x3f, sizeof(d));
    31     d[c1] = 0;
    32     while(!Q.empty()) {
    33         int u = Q.top().u;
    34         Q.pop();
    35         if(vis[u]) continue;
    36         vis[u] = 1;
    37         for(int i = 0; i < E[u].size(); i++) {
    38             int v = E[u][i].v, w = E[u][i].dis, c = E[u][i].cost;
    39             if(d[v] > d[u] + w) {
    40                 d[v] = d[u] + w;
    41                 sum[v] = sum[u] + c;
    42                 Q.push(node{v, d[v]});
    43                 pre[v] = u;
    44             }
    45             else if(d[v] == d[u] + w) {
    46                 if(sum[u] + c < sum[v]) {
    47                     sum[v] = sum[u] + c;
    48                     Q.push(node{v, d[v]});
    49                     pre[v] = u;
    50                 }
    51             }
    52         }
    53     }
    54 
    55 }
    56 
    57 void print(int u){
    58     if(u != -1){
    59         print(pre[u]);
    60         printf("%d ", u);
    61     }
    62 }
    63 
    64 int main() {
    65     scanf("%d %d %d %d", &n, &m, &c1, &c2);
    66     for(int i = 1; i <= m; i++) {
    67         int u, v, w, c;
    68         scanf("%d %d %d %d", &u, &v, &w, &c);
    69         E[u].push_back(edge{u, v, w, c});
    70         E[v].push_back(edge{v, u, w, c});
    71     }
    72     dijkstra();
    73     pre[c1] = -1;
    74     print(c2);
    75     printf("%d %d", d[c2], sum[c2]);
    76     return 0;
    77 }
    View Code

    1031 Hello World for U

    模拟暴力输出。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 char s[85];
     8 
     9 int main() {
    10     scanf("%s", s);
    11     int n = strlen(s), n1 = (n + 2) / 3, n2 = n - 2 * n1;
    12     for(int i = 0; i < n1 - 1; i++) {
    13         printf("%c", s[i]);
    14         for(int j = 1; j <= n2; j++) printf(" ");
    15         printf("%c
    ", s[n - i - 1]);
    16     }
    17     for(int i = n1 - 1; i <= n1 + n2; i++) {
    18         printf("%c",s[i]);
    19     }
    20     return 0;
    21 }
    View Code

    1032 Sharing 

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

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int N = 1e5 + 10;
     7 int nxt[N], vis[N];
     8 
     9 int main() {
    10     int s1, s2, n;
    11     scanf("%d %d %d", &s1, &s2, &n);
    12     for(int i = 1; i <= n; i++) {
    13         int Now, Nxt;
    14         char c;
    15         scanf("%d %c %d", &Now, &c, &Nxt);
    16         nxt[Now] = Nxt;
    17     }
    18     while(s1 != -1) {
    19         vis[s1]++;
    20         s1 = nxt[s1];
    21     }
    22     while(s2 != -1) {
    23         if(vis[s2]) {
    24             printf("%05d
    ", s2);
    25             return 0;
    26         }
    27         vis[s2]++;
    28         s2 = nxt[s2];
    29     }
    30     printf("-1
    ");
    31     return 0;
    32 }
    View Code

    1033 To Fill or Not to Fill 

    贪心策略:优先前往油价低的站,若比当前油价低,直接跑到这个站;否则前往这些站中油价最低的站。更新当前位置和油桶中的油量和最后的答案。

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int N = 555;
     7 const double INF = 1e18;
     8 struct node {
     9     double dis, price;
    10 }sta[N];
    11 
    12 bool cmp(node x, node y) {
    13     return x.dis < y.dis;
    14 }
    15 
    16 int main() {
    17     int now_pos = 0, n;
    18     double c_max, d, d_avg, ans = 0, now_tank = 0;
    19     scanf("%lf %lf %lf %d", &c_max, &d, &d_avg, &n);
    20     for(int i = 0; i < n; i++) {
    21         scanf("%lf %lf", &sta[i].price, &sta[i].dis);
    22     }
    23     sta[n].price = 0; sta[n].dis = d;
    24     sort(sta, sta + 1 + n, cmp);
    25     if(sta[0].dis != 0) {
    26         printf("The maximum travel distance = 0.00
    ");
    27         return 0;
    28     }
    29     while(now_pos < n) {
    30         int nxt_pos = -1;
    31         double min_price = INF;
    32         for(int i = now_pos + 1; i <= n && (sta[i].dis - sta[now_pos].dis) <= c_max * d_avg; i++) {
    33             if(min_price > sta[i].price) {
    34                 min_price = sta[i].price;
    35                 nxt_pos = i;
    36                 if(min_price < sta[now_pos].price) {
    37                     break;
    38                 }
    39             }
    40         }
    41         if(nxt_pos == -1) break;
    42         double need = (sta[nxt_pos].dis - sta[now_pos].dis) / d_avg;
    43         if(min_price < sta[now_pos].price) {
    44             if(now_tank >= need) {
    45                 now_tank -= need;
    46             } else {
    47                 ans += (need - now_tank) * sta[now_pos].price;
    48                 now_tank = 0;
    49             }
    50         } else {
    51             ans += (c_max - now_tank) * sta[now_pos].price;
    52             now_tank = c_max - need;
    53         }
    54         now_pos = nxt_pos;
    55     }
    56     if(now_pos == n) {
    57         printf("%.2f
    ", ans);
    58     } else {
    59         printf("The maximum travel distance = %.2f
    ", sta[now_pos].dis + c_max * d_avg);
    60     }
    61     return 0;
    62 }
    View Code

    1034 Head of a Gang

    并查集扔扔,map标记来标记过去,最后存起来排个序。

     1 //1034 Head of a Gang
     2 #include <map>
     3 #include <cstdio>
     4 #include <vector>
     5 #include <iostream>
     6 #include <algorithm>
     7 using namespace std;
     8 
     9 struct node{
    10     string name;
    11     int cnt;
    12 };
    13 
    14 bool cmp(node x, node y) {
    15     return x.name < y.name;
    16 }
    17 
    18 const int N = 2010;
    19 vector <string> v[N];
    20 vector <node> ans;
    21 map<string, int> m;
    22 map<int, string> rm;
    23 int fa[N], t[N];
    24 
    25 int fi(int x) {
    26     return fa[x] == x ? x : fa[x] = fi(fa[x]);
    27 }
    28 
    29 int main() {
    30     for(int i = 1; i < N; i++) fa[i] = i;
    31     int cnt = 0;
    32     int n, k, time;
    33     string name1, name2, name;
    34     cin >> n >> k;
    35     for(int i = 1; i <= n; i++) {
    36         cin >> name1 >> name2 >> time;
    37         if(!m[name1]) m[name1] = ++cnt, rm[cnt] = name1;
    38         if(!m[name2]) m[name2] = ++cnt, rm[cnt] = name2;
    39         t[m[name1]] += time;
    40         t[m[name2]] += time;
    41         int fx = fi(m[name1]), fy = fi(m[name2]);
    42         if(fx != fy) {
    43             fa[fx] = fy;
    44         }
    45     }
    46     for(int i = 1; i <= n; i++) {
    47         int id = fi(i);
    48         v[id].push_back(rm[i]);
    49     }
    50     for(int i = 1; i <= n; i++) {
    51         if(v[i].size() > 2) {
    52             int sum = 0, mx = 0;
    53             for(int j = 0; j < v[i].size(); j++) {
    54                 sum += t[m[v[i][j]]];
    55                 if(mx < t[m[v[i][j]]]) {
    56                     mx = t[m[v[i][j]]];
    57                     name = v[i][j];
    58                 }
    59             }
    60             node tmp; tmp.cnt = v[i].size(); tmp.name = name;
    61             if(sum > 2 * k) ans.push_back(tmp);
    62         }
    63     }
    64     sort(ans.begin(), ans.end(), cmp);
    65     cout << ans.size() << endl;
    66     for(int i = 0; i < ans.size(); i++) {
    67         cout << ans[i].name << " " << ans[i].cnt << endl;
    68     }
    69     return 0;
    70 }
    View Code

    1035 Password 

    注意输出格式。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int N = 1005;
     8 bool vis[N];
     9 char s1[N][15], s2[N][15];
    10 
    11 int main() {
    12     int n, m, cnt = 0;
    13     scanf("%d", &n);
    14     for(int i = 0; i < n; i++) {
    15         scanf("%s %s", s1[i], s2[i]);
    16         m = strlen(s2[i]);
    17         for(int j = 0; j < m; j++) {
    18             if(s2[i][j] == '1') s2[i][j] = '@', vis[i] = 1;
    19             if(s2[i][j] == '0') s2[i][j] = '%', vis[i] = 1;
    20             if(s2[i][j] == 'l') s2[i][j] = 'L', vis[i] = 1;
    21             if(s2[i][j] == 'O') s2[i][j] = 'o', vis[i] = 1;
    22         }
    23         if(vis[i]) cnt++;
    24     }
    25     if(!cnt) {
    26         if(n == 1) printf("There is %d account and no account is modified
    ", n);
    27         else printf("There are %d accounts and no account is modified
    ", n);
    28     } else {
    29         printf("%d
    ", cnt);
    30         for(int i = 0; i < n; i++) {
    31             if(vis[i]) printf("%s %s
    ", s1[i], s2[i]);
    32         }
    33     }
    34     return 0;
    35 }
    View Code

    1036 Boys vs Girls

    模拟即可。

     1 #include <cstdio>
     2 #include <vector>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 struct node{
     8     string name, gender, ID;
     9     int grade;
    10 }ans;
    11 
    12 bool cmp(node x, node y) {
    13     return x.grade < y.grade;
    14 }
    15 
    16 vector <node> M, F;
    17 
    18 int main() {
    19     int n, grade;
    20     string name, gender, ID;
    21     cin >> n;
    22     for(int i = 1; i <= n; i++) {
    23         cin >> name >> gender >> ID >> grade;
    24         if(gender == "M") M.push_back(node{name, gender, ID, grade});
    25         else F.push_back(node{name, gender, ID, grade});
    26     }
    27     sort(M.begin(), M.end(), cmp);
    28     sort(F.begin(), F.end(), cmp);
    29     if(!M.size() || !F.size()) {
    30         if(F.size()) {
    31             ans = F[F.size() - 1];
    32             cout << ans.name << " " << ans.ID << endl;
    33         } else {
    34             cout << "Absent" << endl;
    35         }
    36         if(M.size()) {
    37             ans = M[0];
    38             cout << ans.name << " " << ans.ID << endl;
    39         } else {
    40             cout << "Absent" << endl;
    41         }
    42         cout << "NA" << endl;
    43     } else {
    44         ans = F[F.size() - 1];
    45         grade = ans.grade;
    46         cout << ans.name << " " << ans.ID << endl;
    47         ans = M[0];
    48         cout << ans.name << " " << ans.ID << endl;
    49         grade -= ans.grade;
    50         cout << grade << endl;
    51     }
    52     return 0;
    53 }
    View Code

    1037 Magic Coupon 

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

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

    1038 Recover the Smallest Number 

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

     1 //1038
     2 #include <vector>
     3 #include <cstdio>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 vector <string> v;
     9 
    10 bool cmp(string s1, string s2) {
    11     return s1 + s2 < s2 + s1;
    12 }
    13 
    14 int main() {
    15     int n;
    16     bool vis = 0;
    17     string s;
    18     cin >> n;
    19     for(int i = 0; i < n; i++) {
    20         cin >> s;
    21         v.push_back(s);
    22     }
    23     sort(v.begin(), v.end(), cmp);
    24     s = "";
    25     for(int i = 0; i < n; i++) s = s + v[i];
    26     for(int i = 0; i < s.size(); i++) {
    27         if(s[i] == '0' && !vis) continue;
    28         else {
    29             vis = 1;
    30             cout << s[i];
    31         }
    32     }
    33     if(!vis) cout << 0;
    34     return 0;
    35 }
    View Code

    1039 Course List for Student 

    map标记位置,按坑填就即可。题目中的N应该是400000吧(汗...)

     1 #include <map>
     2 #include <vector>
     3 #include <cstdio>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 char s[10];
     9 map <int, int> m;
    10 const int N = 400000 + 10;
    11 vector <int> v[N];
    12 
    13 int cal() {
    14     int res = (s[3] - '0');
    15     res += (s[2] - 'A') * 10;
    16     res += (s[1] - 'A') * 26 * 10;
    17     res += (s[0] - 'A') * 26 * 26 * 10;
    18     return res;
    19 }
    20 
    21 int main() {
    22     int n, k, a, b, name, cnt = 1;
    23     scanf("%d%d", &n, &k);
    24     for(int i = 1; i <= k; i++) {
    25         scanf("%d%d", &a, &b);
    26         for(int j = 1; j <= b; j++) {
    27             scanf("%s", s);
    28             name = cal() + 1;
    29             if(!m[name]) m[name] = cnt++;
    30             v[m[name]].push_back(a);
    31         }
    32     }
    33     for(int i = 1 ; i <= cnt; i++) sort(v[i].begin(), v[i].end());
    34     for(int i = 1; i <= n; i++) {
    35         scanf("%s", s);
    36         name = cal() + 1;
    37         int id = m[name];
    38         printf("%s %d", s, v[id].size());
    39         for(int j = 0; j < v[id].size(); j++) {
    40             printf(" %d", v[id][j]);
    41         }
    42         printf("
    ");
    43     }
    44     return 0;
    45 }
    View Code

    1040 Longest Symmetric String

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

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

    1041 Be Unique 

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

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

    1042 Shuffling Machine

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

     1 #include <cstdio>
     2 using namespace std;
     3 
     4 char s[5] = {'S','H','C','D','J'};
     5 
     6 int A[60], B[60], in[60];
     7 
     8 int main() {
     9     int n;
    10     scanf("%d", &n);
    11     for(int i = 1; i <= 54; i++) A[i] = i;
    12     for(int i = 1; i <= 54; i++) scanf("%d", &in[i]);
    13     for(int i = 0; i < n; i++) {
    14         for(int j = 1; j <= 54; j++) B[in[j]] = A[j];
    15         for(int j = 1; j <= 54; j++) A[j] = B[j];
    16     }
    17     for(int i = 1; i <= 54; i++) {
    18         if(i > 1) printf(" ");
    19         printf("%c%d", s[(B[i]-1)/13], (B[i]-1)%13+1);
    20     }
    21     return 0;
    22 }
    View Code

    1043 Is It a Binary Search Tree 

    (学习一波柳神的写法。)由前序遍历找到左右孩子的边界。注意边界的调整,因为后序遍历是左右根,我们DFS的时候先往左搜索,搜完后把答案存下来。

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int N = 1234;
     7 bool f = 0;
     8 int pre[N], post[N], cnt = 0;
     9 
    10 void dfs(int root, int tail) {
    11     if(root > tail) return ;
    12     int l = root + 1, r = tail;
    13     if(!f) {
    14         while(l <= tail && pre[l] < pre[root]) l++;
    15         while(r >= root && pre[r] >= pre[root]) r--;
    16     } else {
    17         while(l <= tail && pre[l] >= pre[root]) l++;
    18         while(r >= root && pre[r] < pre[root]) r--;
    19     }
    20     dfs(root + 1, r);
    21     dfs(l, tail);
    22     post[++cnt] = pre[root];
    23 }
    24 
    25 int main() {
    26     int n;
    27     cin >> n;
    28     for(int i = 1; i <= n; i++) cin >> pre[i];
    29     dfs(1, n);
    30     if(cnt != n) {
    31         cnt = 0;
    32         f = 1;
    33         dfs(1, n);
    34     }
    35     if(cnt == n) {
    36         cout << "YES" << endl;
    37         for(int i = 1; i <= n; i++) {
    38             if(i == 1) cout << post[i];
    39             else cout << " " << post[i];
    40         }
    41     } else {
    42         cout << "NO" << endl;
    43     }
    44     return 0;
    45 }
    View Code

    1044 Shopping in Mars

    先前缀和,然后两次二分,第一次找>=m最小的。第二次二分把符合的扔进去。

     1 //1044 Shopping in Mars
     2 #include <vector>
     3 #include <cstdio>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int INF = 0x3f3f3f3f;
     9 const int N = 1e5 + 10;
    10 int a[N];
    11 vector< pair<int, int> > v;
    12 
    13 int main() {
    14     int n, m;
    15     int mi = INF;
    16     scanf("%d %d", &n, &m);
    17     for(int i = 0; i < n; i++) {
    18         scanf("%d", &a[i]);
    19         if(i != 0) a[i] += a[i - 1];
    20     }
    21     for(int i = 0; i < n; i++) {
    22         int val = 0;
    23         if(i != 0) val = a[i - 1];
    24         int pos = lower_bound(a + i, a + n, val + m) - a;
    25         if((a[pos] -val) >= m) {
    26             mi = min(mi, (a[pos] - val));
    27         }
    28     }
    29     for(int i = 0; i < n; i++) {
    30         int val = 0;
    31         if(i != 0) val = a[i - 1];
    32         int pos = lower_bound(a + i, a + n, val + mi) - a;
    33         if((a[pos] -val) == mi) {
    34             v.push_back(make_pair(i + 1, pos + 1));
    35         }
    36     }
    37     for(int i = 0; i < v.size(); i++) {
    38         printf("%d-%d
    ", v[i].first, v[i].second);
    39     }
    40     return 0;
    41 }
    View Code

    1045 Favorite Color Stripe

    连dp渣渣的我都会写。从后往前,先找出该点位置在a数组中对应的颜色,然后从后面的颜色转移过来。

    $dp[b[i]] = max( dp[b[i]], dp[a[j]] + 1)$

     1 //1045 Favorite Color Stripe
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int N = 210;
     8 const int L = 10010;
     9 int a[N], dp[N], b[L];
    10 
    11 int main() {
    12     int n, m, l, ans = 0;
    13     cin >> n >> m;
    14     for(int i = 1; i <= m; i++) cin >> a[i];
    15     cin >> l;
    16     for(int i = 1; i <= l; i++) cin >> b[i];
    17     for(int i = l; i >= 1; i--) {
    18         bool f = 0;
    19         for(int j = 1; j <= m; j++) {
    20             if(b[i] == a[j]) f = 1;
    21             if(f) {
    22                 dp[b[i]] = max(dp[b[i]] ,dp[a[j]] + 1);
    23                 ans = max(ans, dp[b[i]]);
    24             }
    25         }
    26     }
    27     cout << ans << endl;
    28     return 0;
    29 }
    View Code

    1046 Shortest Distance

    小学数学题。前缀和下,再分别顺时针和逆时针比较下。

     1 //1046 Shortest Distance
     2 #include <vector>
     3 #include <cstdio>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N = 1e5 + 10;
     9 int a[N];
    10 
    11 int main() {
    12     int n, m;
    13     cin >> n;
    14     for(int i = 1; i <= n; i++) {
    15         cin >> a[i];
    16         a[i] += a[i - 1];
    17     }
    18     cin >> m;
    19     for(int i = 1; i <= m; i++) {
    20         int l, r;
    21         cin >> l >> r;
    22         if(l > r) swap(l, r);
    23         int ans1 = a[r - 1] - a[l - 1];
    24         int ans2 = (a[n] - a[r - 1]) + a[l - 1];
    25         cout << min(ans1, ans2) << endl;
    26     }
    27     return 0;
    28 }
    View Code

    1047 Student List for Course

    对应存就好了。

     1 //1047 Student List for Course
     2 #include <vector>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <iostream>
     6 #include <algorithm>
     7 using namespace std;
     8 
     9 const int N = 2505;
    10 char s[20 * N][5];
    11 vector <int> v[N];
    12 
    13 bool cmp(int a, int b) {
    14     return strcmp(s[a], s[b]) < 0;
    15 }
    16 
    17 int main() {
    18     int n, m, k, id;
    19     scanf("%d %d", &n, &m);
    20     for(int i = 1; i <= n; i++) {
    21         scanf("%s %d", s[i], &k);
    22         for(int j = 1; j <= k; j++) {
    23             scanf("%d", &id);
    24             v[id].push_back(i);
    25         }
    26     }
    27     for(int i = 1; i <= m; i++) sort(v[i].begin(), v[i].end(), cmp);
    28     for(int i = 1; i <= m; i++) {
    29         printf("%d %d
    ", i, v[i].size());
    30         for(int j = 0; j < v[i].size(); j++) {
    31             printf("%s
    ", s[v[i][j]]);
    32         }
    33     }
    34     return 0;
    35 }
    View Code

    1048 Find Coins 

    标记,特判下m-a[i] 和a[i]相同的情况。

     1 //1048 Find Coins 
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int N = 1e5 + 10;
     8 int a[N], index[N];
     9 
    10 int main() {
    11     int n, m;
    12     scanf("%d %d", &n, &m);
    13     for(int i = 1; i <= n; i++) {
    14         scanf("%d", &a[i]);
    15         index[a[i]]++;
    16     }
    17     sort(a + 1, a + 1 + n);
    18     for(int i = 1; i <= n; i++) {
    19         int other = m - a[i];
    20         if(other == a[i] && index[other] >= 2) {
    21             printf("%d %d
    ", a[i], a[i]);
    22             return 0;
    23         }
    24         else if(other != a[i] && index[other]) {
    25             printf("%d %d
    ", a[i], other);
    26             return 0;
    27         }
    28     }
    29     printf("No Solution
    ");
    30     return 0;
    31 }
    View Code

    1049 Counting Ones

    题意:询问从1-n有多少个1,11这样算两个。考虑按位计算,分以下三种情况:

    当前位=0,左边*当前位数。

    当前位=1,左边*当前位数 + 右边 + 1

    当前位>1,(左边+1)*右边

     1 //1049 Counting Ones
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 typedef long long ll;
     8 
     9 int main() {
    10     ll n, base = 1, ans = 0;
    11     cin >> n;
    12     while(n / base) {
    13         ll now = (n % (10 * base) ) / base;
    14         ll left = (n / (10 * base) ), right = n % base;
    15         if(now == 0) ans += left * base;
    16         else if(now == 1) ans += left * base + right + 1;
    17         else ans += (left + 1) * base;
    18         base *= 10;
    19     }
    20     cout << ans << endl;
    21     return 0;
    22 }
    View Code

    1050 String Subtraction

    map一下就可以了。

     1 //1050 String Subtraction
     2 #include <map>
     3 #include <cstdio>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N = 1e4 + 10;
     9 char s[N];
    10 map <char, int> m;
    11 
    12 int main() {
    13     char c;
    14     int cnt = 0;
    15     while(scanf("%c", &s[++cnt]) != EOF && s[cnt] != '
    ');
    16     while(scanf("%c", &c) != EOF && c != '
    ') {
    17         m[c]++;
    18     }
    19     for(int i = 1; i <= cnt; i++) {
    20         if(!m[s[i]]) printf("%c", s[i]);
    21     }
    22     return 0;
    23 }
    View Code

    1051 Pop Sequence 

    模拟入栈操作,如果遍历到的数刚好和栈定元素相同,出栈一个元素,遍历位置+1,在比较直到不同,入栈过程中需要注意判断栈容量。

     1 //1051 Pop Sequence
     2 #include <stack>
     3 #include <cstdio>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N = 1234;
     9 int a[N];
    10 stack<int> s;
    11 
    12 int main() {
    13     int m, n, k;
    14     scanf("%d %d %d", &m, &n, &k);
    15     while(k--) {
    16         int now = 1;
    17         bool f = 1;
    18         while(s.size()) s.pop();
    19         for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    20         for(int i = 1; i <= n; i++) {
    21             s.push(i);
    22             if(a[now] == s.top() && s.size() <= m) {
    23                 while(s.size() && a[now] == s.top()) {
    24                     now++;
    25                     s.pop();
    26                 }
    27             }
    28             else if(s.size() > m) {
    29                 f = 0;
    30                 break;
    31             }
    32         }
    33         if(s.size()) f = 0;
    34         if(f) printf("YES
    ");
    35         else printf("NO
    ");
    36     }
    37     return 0;
    38 }
    View Code

    1052 Linked List Sorting

    先找到给定头节点的那条链,接着把这条链的元素拿出来按key从小到大排序。注意可能这样的链一条都没有。(输出0 -1)

     1 //1052 Linked List Sorting
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N = 1e5 + 10;
     9 int run[N], vis[N];
    10 struct node {
    11     int key;
    12     int now, next;
    13 }p[N];
    14 
    15 bool cmp(node x, node y) {
    16     return x.key < y.key;
    17 }
    18 
    19 void dfs(int u) {
    20     if(u == -1) return ;
    21     vis[u] = 1;
    22     dfs(run[u]);
    23 }
    24 
    25 int main() {
    26     int n, head, cnt = 0;
    27     scanf("%d %d", &n, &head);
    28     for(int i = 1; i <= n; i++) {
    29         scanf("%d %d %d", &p[i].now, &p[i].key, &p[i].next);
    30         run[p[i].now] = p[i].next;
    31     }
    32     dfs(head);
    33     sort(p + 1, p + 1 + n, cmp);
    34     for(int i = 1; i <= n; i++) {
    35         if(vis[p[i].now]) {
    36             p[++cnt] = p[i];
    37         }
    38     }
    39     if(cnt == 0) {
    40         printf("0 -1
    ");
    41         return 0;
    42     }
    43     printf("%d %05d
    ", cnt, p[1].now);
    44     for(int i = 1; i < cnt; i++) {
    45         printf("%05d %d %05d
    ", p[i].now, p[i].key, p[i + 1].now);
    46     }
    47     printf("%05d %d -1
    ", p[cnt].now, p[cnt].key);
    48     return 0;
    49 }
    View Code

    1053 Path of Equal Weight

    存边的时候先儿子节点权值从大到小排序,DFS把所有答案搜出来。

     1 //1053 Path of Equal Weight
     2 #include <vector>
     3 #include <cstdio>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N = 123;
     9 int n, m, s;
    10 int a[N], cnt = 0;
    11 vector<int> E[N], tmp;
    12 vector<int> res[N];
    13 
    14 struct node{
    15     int w,v;
    16 }b[N];
    17 
    18 bool cmp(node x, node y) {
    19     return x.w > y.w;
    20 }
    21 
    22 void dfs(int u, int sum) {
    23     if(sum > s) return ;
    24     tmp.push_back(a[u]);
    25     if(sum + a[u] == s && !E[u].size()) {
    26         res[cnt++] = tmp;
    27     }
    28     for(int i = 0; i < E[u].size(); i++) {
    29         dfs(E[u][i], sum + a[u]);
    30     }
    31     tmp.pop_back();
    32 }
    33 
    34 
    35 int main() {
    36     scanf("%d %d %d", &n, &m, &s);
    37     for(int i = 0; i < n; i++) scanf("%d", &a[i]);
    38     for(int i = 1; i <= m; i++) {
    39         int u, k;
    40         scanf("%d %d", &u, &k);
    41         for(int j = 1; j <= k; j++) {
    42             scanf("%d", &b[j].v);
    43             b[j].w = a[b[j].v];
    44         }
    45         sort(b + 1, b + 1 + k, cmp);
    46         for(int j = 1; j <= k; j++) E[u].push_back(b[j].v);
    47     }
    48     dfs(0, 0);
    49     for(int i = 0; i < cnt; i++) {
    50         for(int j = 0; j < res[i].size(); j++) {
    51             if(j == res[i].size() - 1) printf("%d
    ", res[i][j]);
    52             else printf("%d ", res[i][j]);
    53         }
    54     }
    55     return 0;
    56 }
    View Code

    1054 The Dominant Color

    标记颜色出现次数即可。

     1 // 1054 The Dominant Color
     2 #include <map>
     3 #include <cstdio>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 map<int, int> cnt;
     9 
    10 int main() {
    11     int n, m, col;
    12     scanf("%d %d", &n, &m);
    13     for(int i = 1; i <= n; i++) {
    14         for(int j = 1; j <= m; j++) {
    15             scanf("%d", &col);
    16             cnt[col]++;
    17             if(2 * cnt[col] > n *m) {
    18                 printf("%d", col);
    19                 return 0;
    20             }
    21         }
    22     }
    23     return 0;
    24 }
    View Code

    1055 The World's Richest

    结构体排序下,暴力遍历,输出即可。

     1 // 1055 The World's Richest
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int N = 1e5 + 10;
     9 struct node {
    10     char name[10];
    11     int age, worth;
    12 }p[N];
    13 
    14 bool cmp(node x, node y) {
    15     if(x.worth == y.worth) {
    16         if(x.age == y.age) return strcmp(x.name, y.name) < 0;
    17         return x.age < y.age;
    18     }
    19     return x.worth > y.worth;
    20 }
    21 
    22 int main() {
    23     int n, k;
    24     scanf("%d %d", &n, &k);
    25     for(int i = 0; i < n; i++) {
    26         scanf("%s %d %d", p[i].name, &p[i].age, &p[i].worth);
    27     }
    28     sort(p, p + n, cmp);
    29     for(int i = 1; i <= k; i++) {
    30         int m, mi, mx, cnt = 0;
    31         scanf("%d %d %d", &m, &mi, &mx);
    32         printf("Case #%d:
    ", i);
    33         for(int j = 0; j < n; j++) {
    34             if(p[j].age >= mi && p[j].age <= mx) {
    35                 cnt++;
    36                 printf("%s %d %d
    ", p[j].name, p[j].age, p[j].worth);
    37             }
    38             if(cnt == m) break;
    39         }
    40         if(cnt == 0) printf("None
    ");
    41     }
    42     return 0;
    43 }
    View Code

    1056 Mice and Rice

    用队列模拟下每次遍历组的操作。每组清空,再把质量最大的入队。排名即为当前组数+1

     1 // 1056 Mice and Rice
     2 #include <queue>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <iostream>
     6 #include <algorithm>
     7 using namespace std;
     8 
     9 const int N = 1234;
    10 int w[N], ans[N];
    11 
    12 queue <int> q;
    13 
    14 int main() {
    15     int n, m, u, v, cnt;
    16     scanf("%d %d", &n, &m);
    17     for(int i = 1; i <= n; i++) scanf("%d", &w[i]);
    18     for(int j = 1; j <= n; j++) {
    19         scanf("%d", &v);
    20         q.push(v + 1);
    21     }
    22     cnt = n;
    23     while(q.size() != 1) {
    24         int g = (cnt / m) + ( (cnt % m) > 0 ? 1 : 0 );
    25         for(int i = 0; i < g; i++) {
    26             int k = q.front();
    27             for(int j = 1; j <= m; j++) {
    28                 if(i * m + j > cnt) break;
    29                 u = q.front();
    30                 if(w[u] > w[k]) k = u;
    31                 q.pop();
    32                 ans[u] = g + 1;
    33             }
    34             q.push(k);
    35         }
    36         cnt = g;
    37     }
    38     ans[q.front()] = 1;
    39     for(int i = 1; i <= n; i++) {
    40         printf("%d%c", ans[i], i == n ? '
    ' : ' ');
    41     }
    42     return 0;
    43 }
    View Code

    1057 Stack

    模拟栈操作。查询的时候二分一下,从树状数组中存的值,查找最前面出现的中值。

     1 // 1057 Stack
     2 #include <stack>
     3 #include <iostream>
     4 #include <algorithm>
     5 #define low(i) ((i)&(-i))
     6 using namespace std;
     7 
     8 const int N = 1e5 + 10;
     9 int c[N], n, u;
    10 char op[10];
    11 stack <int> sta;
    12 
    13 void add(int pos, int v) {
    14     for(int i = pos; i < N; i += low(i)) c[i] += v;
    15 }
    16 
    17 int query(int pos) {
    18     int res = 0;
    19     for(int i = pos; i; i -= low(i)) res += c[i];
    20     return res;
    21 }
    22 
    23 int PeekMedian() {
    24     int sz = (sta.size() + 1) / 2;
    25     int l = 1, r = N - 10 , ans = -1;
    26     while(l <= r) {
    27         int mid = (l + r) / 2;
    28         if(query(mid) >= sz)  ans = mid, r = mid - 1;
    29         else l = mid + 1;
    30     }
    31     return ans;
    32 }
    33 
    34 int main() {
    35     scanf("%d", &n);
    36     while(n--) {
    37         scanf("%s", op);
    38         if(op[1] == 'u') {
    39             scanf("%d", &u);
    40             add(u, 1);
    41             sta.push(u);
    42         }
    43         else if(op[1] == 'o') {
    44             if(sta.empty()) printf("Invalid
    ");
    45             else {
    46                 printf("%d
    ", sta.top());
    47                 add(sta.top(), -1);
    48                 sta.pop();
    49             }
    50         } else {
    51             if(sta.empty()) printf("Invalid
    ");
    52             else {
    53                 printf("%d
    ", PeekMedian());
    54             }
    55         }
    56     }
    57     return 0;
    58 }
    View Code

    1058 A+B in Hogwarts

    水题。

     1 // 1058 A+B in Hogwarts
     2 #include <cstdio>
     3 using namespace std;
     4 
     5 int a[6];
     6 
     7 int main() {
     8 
     9     scanf("%d.%d.%d %d.%d.%d", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]);
    10     if(a[2] + a[5] >= 29) {
    11         a[1]++;
    12         a[2] -= 29;
    13     }
    14     if(a[1] + a[4] >= 17) {
    15         a[0]++;
    16         a[1] -= 17;
    17     }
    18     printf("%d.%d.%d", a[0] + a[3], a[1] + a[4], a[2] + a[5]);
    19     return 0;
    20 }
    View Code

    1059 Prime Factors

    暴力sqrt(n)判断下,对应输出即可。

     1 //1059 Prime Factors
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 typedef long long ll;
     8 
     9 int main() {
    10     bool f = 0;
    11     ll n;
    12     scanf("%lld", &n);
    13     printf("%lld=", n);
    14     for(ll i = 2; i * i <= n; i++) {
    15         if(n % i == 0) {
    16             ll cnt = 0;
    17             while(n % i == 0) {
    18                 n /= i;
    19                 cnt++;
    20             }
    21             if(!f) {
    22                 printf("%lld", i), f = 1;
    23             } else {
    24                 printf("*%lld", i);
    25             }
    26             if(cnt > 1) printf("^%lld", cnt);
    27         }
    28     }
    29     if(n > 1) {
    30         if(!f) {
    31             printf("%lld", n);
    32         } else {
    33             printf("*%lld", n);
    34         }
    35     }
    36     return 0;
    37 }
    View Code

    1060 Are They Equal

    这题自己的写法一直只有21分(心态炸了)。搜了波题解,发现怎么还有前导0这种输入啊(妈耶),还要注意不够位要拿0去补。

     1 //1060 Are They Equal
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 int n;
     8 
     9 string solve(string s, int& k) {
    10     int i = 0 , cnt = 0;
    11     string res = "";
    12     while(s.size() && s[0] == '0') {
    13         s.erase(s.begin());
    14     }
    15     if(s[0] == '.') {
    16         s.erase(s.begin());
    17         while(s.size() && s[0] == '0') {
    18             s.erase(s.begin());
    19             k--;
    20         }
    21     } else {
    22         while(i < s.size() && s[i] != '.') {
    23             i++;
    24             k++;
    25         }
    26         if(i < s.size()) s.erase(s.begin() + i);
    27     }
    28     if(s.size() == 0) k = 0;
    29     i = 0;
    30     while(cnt < n) {
    31         if(i < s.size()) res = res + s[i++];
    32         else res = res + "0";
    33         cnt++;
    34     }
    35     return res;
    36 }
    37 
    38 int main() {
    39     int k1 = 0, k2 = 0;
    40     string s1, s2, s3, s4;
    41     cin >> n >> s1 >> s2;
    42     s3 = solve(s1, k1);
    43     s4 = solve(s2, k2);
    44     if(s3 == s4 && k1 == k2) {
    45         cout << "YES " << "0." << s3 << "*10^" << k1 << endl;
    46     } else {
    47         cout << "NO " << "0." << s3 << "*10^" << k1 << " 0." << s4 << "*10^" << k2 << endl;
    48     }
    49     return 0;
    50 }
    View Code

    1061 Dating

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

     1 // 1061 Dating
     2 #include <iostream>
     3 using namespace std;
     4 
     5 string week[10] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
     6 
     7 int main() {
     8     int pos = 0;
     9     string s1, s2, s3, s4;
    10     cin >> s1 >> s2 >> s3 >> s4;
    11     int n = min(s1.size(), s2.size());
    12     for(int i = 0; i < n; i++) {
    13         if(s1[i] >= 'A' && s1[i] <= 'G') {
    14             if(s1[i] == s2[i]) {
    15                 pos = i + 1;
    16                 int k = (s1[i] - 'A');
    17                 cout << week[k];
    18                 break;
    19             }
    20         }
    21     }
    22     for(int i = pos; i < n; i++) {
    23         if( (s1[i] >= 'A' && s1[i] <= 'N') || (s1[i] >= '0' && s1[i] <= '9') ) {
    24             if(s1[i] == s2[i]) {
    25                 if(s1[i] >= '0' && s1[i] <= '9') {
    26                     cout << " 0" << s1[i] << ":";
    27                 } else {
    28                     int k = (s1[i] - 'A' + 10);
    29                     cout << " " << k << ":";
    30                 }
    31                 break;
    32             }
    33         }
    34     }
    35     n = min(s3.size(), s4.size());
    36     for(int i = 0; i < n; i++) {
    37         if(s3[i] >= 'a' && s3[i] <= 'z' || s3[i] >= 'A' && s3[i] <= 'Z') {
    38             if(s3[i] == s4[i]) {
    39                 if(i < 10) cout << "0" << i << endl;
    40                 else cout << i << endl;
    41                 break;
    42             }
    43         }
    44     }
    45     return 0;
    46 }
    View Code

    1062 Talent and Virtue

    结构体排序,按照题目要求排序即可。

     1 // 1062 Talent and Virtue
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int N = 1e5 +10;
     8 struct node{
     9     int g, id, virtue, talent, total;
    10 }p[N];
    11 
    12 bool cmp(node x, node y) {
    13     if(x.g == y.g) {
    14         if(x.total == y.total) {
    15             if(x.virtue == y.virtue) return x.id < y.id;
    16             return x.virtue > y.virtue;
    17         }
    18         return x.total > y.total;
    19     }
    20     return x.g < y.g;
    21 }
    22 
    23 int main() {
    24     int n, l, h, cnt = 0;
    25     scanf("%d%d%d", &n, &l, &h);
    26     for(int i = 1; i <= n; i++) {
    27         scanf("%d %d %d", &p[i].id, &p[i].virtue, &p[i].talent);
    28         p[i].total = p[i].virtue + p[i].talent;
    29         p[i].g = 5;
    30         if(p[i].virtue < l || p[i].talent < l) continue;
    31         cnt++;
    32         if(p[i].virtue >= h && p[i].talent >= h) {
    33             p[i].g = 1;
    34         }
    35         else if(p[i].virtue >= h && p[i].talent < h) {
    36             p[i].g = 2;
    37         }
    38         else if(p[i].virtue < h && p[i].talent < h && p[i].virtue >= p[i].talent) {
    39             p[i].g = 3;
    40         } else {
    41             p[i].g= 4;
    42         }
    43     }
    44     sort(p + 1, p + 1 + n, cmp);
    45     printf("%d
    ", cnt);
    46     for(int i =  1; i <= n; i++) {
    47         if(p[i].g > 4) break;
    48         printf("%08d %d %d
    ", p[i].id, p[i].virtue, p[i].talent);
    49     }
    50     return 0;
    51 }
    View Code
  • 相关阅读:
    servlet异步处理机制
    分析logfilter+session
    java web后台工作原理
    xml的作用
    本学期学习目标 企业级运用和互联网运用的区别
    JAVA EE 思维导图
    第六周
    第五周
    第四周作业
    javaee第三周
  • 原文地址:https://www.cnblogs.com/pavtlly/p/10470068.html
Copyright © 2020-2023  润新知