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\n");
69         else printf("%d %c\n", 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\n", 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\n");
35         else printf("%02d:%02d\n", 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\n");
28         } else {
29             printf("No\n");
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\n", 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\n", date[i + 1].time - date[i].time, (c2 - c1) / 100);
64             res += (c2 - c1) / 100;
65         }
66         printf("Total amount: $%.2f\n", 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\n", 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\n");
22     else printf("No\n");
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\n", 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 == '\n') 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\n", it);
39         } else {
40             printf("Not Found\n");
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\n");
24             if(cnt > 0) printf("1%s", ans + 1);
25             else printf("%s", ans + 1);
26             return 0;
27         }
28     }
29     printf("Yes\n");
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\n", 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\n", 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\n", 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\n", 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\n", s2);
25             return 0;
26         }
27         vis[s2]++;
28         s2 = nxt[s2];
29     }
30     printf("-1\n");
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\n");
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\n", ans);
58     } else {
59         printf("The maximum travel distance = %.2f\n", 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", n);
27         else printf("There are %d accounts and no account is modified\n", n);
28     } else {
29         printf("%d\n", cnt);
30         for(int i = 0; i < n; i++) {
31             if(vis[i]) printf("%s %s\n", 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\n", 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("\n");
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 != '\n') {
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\n", 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\n", 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\n", i, v[i].size());
30         for(int j = 0; j < v[i].size(); j++) {
31             printf("%s\n", 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\n", a[i], a[i]);
22             return 0;
23         }
24         else if(other != a[i] && index[other]) {
25             printf("%d %d\n", a[i], other);
26             return 0;
27         }
28     }
29     printf("No Solution\n");
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] != '\n');
16     while(scanf("%c", &c) != EOF && c != '\n') {
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\n");
35         else printf("NO\n");
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\n");
41         return 0;
42     }
43     printf("%d %05d\n", cnt, p[1].now);
44     for(int i = 1; i < cnt; i++) {
45         printf("%05d %d %05d\n", p[i].now, p[i].key, p[i + 1].now);
46     }
47     printf("%05d %d -1\n", 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\n", 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:\n", 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\n", p[j].name, p[j].age, p[j].worth);
37             }
38             if(cnt == m) break;
39         }
40         if(cnt == 0) printf("None\n");
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 ? '\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\n");
45             else {
46                 printf("%d\n", sta.top());
47                 add(sta.top(), -1);
48                 sta.pop();
49             }
50         } else {
51             if(sta.empty()) printf("Invalid\n");
52             else {
53                 printf("%d\n", PeekMedian());
54             }
55         }
56     }
57     return 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\n", cnt);
46     for(int i =  1; i <= n; i++) {
47         if(p[i].g > 4) break;
48         printf("%08d %d %d\n", p[i].id, p[i].virtue, p[i].talent);
49     }
50     return 0;
51 }
View Code

 

 

 

posted @ 2019-03-04 13:02  pavtlly  阅读(2171)  评论(0编辑  收藏  举报