2021/07/14/C CodeForces - 1249B2

已AC

题干大意是按预定序列决定每天每个小朋友把自己的书给谁,输出小朋友最快能在第几天拿回自己的书。

 

思路:单本书经手人数固定,且经手人的书归还时间也一致,queue存储序号,set确定输出数目大小即可

错误代码:

timelimit超时代码:n2时间复杂度过高

 1 #pragma warning (disable:4996)
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<stdio.h>
 5 #include<math.h>
 6 #include<string.h>
 7 #include<string>
 8 #include<queue>
 9 #include<set>
10 #include<vector>
11 #define MAX1 100005            /*1e5 + 5*/
12 #define MAX2 1000000005        /*le9 + 5*/
13 #define MAX3 200005            /*2e5 + 5*/
14 #define MAX4 5005            /*5e3 + 5*/
15 #define MAX5 1005            /*1e3 + 5*/
16 #define MAX6 10005            /*1e4 + 5*/
17 #define T1 27
18 #define T2 25
19 #define T3 18
20 #define MOL 9223372036854775807
21 using namespace std;
22 typedef long long int ll;
23 //memset(sm, 0, sizeof(sm));
24 ll s[MAX3] = { 0 };
25 ll ans[MAX3] = { 0 };
26 int main() {
27     ll n, m, t;
28     ll i, j, k;
29     while (scanf("%lld", &t) != EOF) {
30         while (t--) {
31             scanf("%lld", &n);
32             for (i = 0; i < n; ++i) {
33                 scanf("%lld", &s[i]);
34                 s[i]--;
35             }
36             for (j = 0; j < n; ++j) {
37                 m = j;
38                 priority_queue<ll>a;
39                 set<ll>b;
40                 for (i = 0; i < n; ++i) {
41                     a.push(m);
42                     b.insert(m);
43                     //cout << m << " " << s[m] << endl;
44                     m = s[m];
45                 }
46                 while(!a.empty()) {
47                     ans[a.top()] = b.size();
48                     a.pop();
49                 }
50             }
51             for (i = 0; i < n; ++i) {
52                 printf(i ? " %lld" : "%lld", ans[i]);
53             }cout << endl;
54         }
55     }
56     return 0;
57 }
超时代码

wrong错误代码:循环减太多了,误当每次经手都会多统计一次,实际上可能需要1~n-1次不等,n为总共n个小朋友。

 1 #pragma warning (disable:4996)
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<stdio.h>
 5 #include<math.h>
 6 #include<string.h>
 7 #include<string>
 8 #include<queue>
 9 #include<set>
10 #include<vector>
11 #define MAX1 100005            /*1e5 + 5*/
12 #define MAX2 1000000005        /*le9 + 5*/
13 #define MAX3 200005            /*2e5 + 5*/
14 #define MAX4 5005            /*5e3 + 5*/
15 #define MAX5 1005            /*1e3 + 5*/
16 #define MAX6 10005            /*1e4 + 5*/
17 #define T1 27
18 #define T2 25
19 #define T3 18
20 #define MOL 9223372036854775807
21 using namespace std;
22 typedef long long int ll;
23 //memset(sm, 0, sizeof(sm));
24 ll s[MAX3] = { 0 };
25 ll ans[MAX3] = { 0 };
26 int main() {
27     ll n, m, t;
28     ll i, j, k;
29     while (scanf("%lld", &t) != EOF) {
30         while (t--) {
31             scanf("%lld", &n);
32             for (i = 0; i < n; ++i) {
33                 scanf("%lld", &s[i]);
34                 s[i]--;
35             }
36             memset(ans, 0, sizeof(ans));
37             for (j = 0; j < n; ++j) {
38                 if (ans[j] == 0) {
39                     m = j;
40                     priority_queue<ll>a;
41                     set<ll>b;
42                     for (i = 0; i < n / 2; ++i) {
43                         a.push(m);
44                         b.insert(m);
45                         //cout << m << " " << s[m] << endl;
46                         m = s[m];
47                     }
48                     while (!a.empty()) {
49                         ans[a.top()] = b.size();
50                         a.pop();
51                     }
52                 }
53             }
54             for (i = 0; i < n; ++i) {
55                 printf(i ? " %lld" : "%lld", ans[i]);
56             }cout << endl;
57         }
58     }
59     return 0;
60 }
错误代码

AC代码:削减时间两点,一是已经赋值的书跳过检测,二是当set加入新元素大小不改变(数目重复)时退出该组统计

 1 #pragma warning (disable:4996)
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<stdio.h>
 5 #include<math.h>
 6 #include<string.h>
 7 #include<string>
 8 #include<queue>
 9 #include<set>
10 #include<vector>
11 #define MAX1 100005            /*1e5 + 5*/
12 #define MAX2 1000000005        /*le9 + 5*/
13 #define MAX3 200005            /*2e5 + 5*/
14 #define MAX4 5005            /*5e3 + 5*/
15 #define MAX5 1005            /*1e3 + 5*/
16 #define MAX6 10005            /*1e4 + 5*/
17 #define T1 27
18 #define T2 25
19 #define T3 18
20 #define MOL 9223372036854775807
21 using namespace std;
22 typedef long long int ll;
23 //memset(sm, 0, sizeof(sm));
24 ll s[MAX3] = { 0 };
25 ll ans[MAX3] = { 0 };
26 int main() {
27     ll n, m, t;
28     ll i, j, k;
29     while (scanf("%lld", &t) != EOF) {
30         while (t--) {
31             scanf("%lld", &n);
32             for (i = 0; i < n; ++i) {
33                 scanf("%lld", &s[i]);
34                 s[i]--;
35             }
36             memset(ans, 0, sizeof(ans));
37             for (j = 0; j < n; ++j) {
38                 if (ans[j] == 0) {
39                     m = j;
40                     priority_queue<ll>a;
41                     set<ll>b;
42                     for (i = 0; i < n ; ++i) {
43                         a.push(m);
44                         ll f = b.size();
45                         b.insert(m);
46                         if (b.size() == f)break;
47                         //cout << m << " " << s[m] << endl;
48                         m = s[m];
49                     }
50                     while (!a.empty()) {
51                         ans[a.top()] = b.size();
52                         a.pop();
53                     }
54                 }
55             }
56             for (i = 0; i < n; ++i) {
57                 printf(i ? " %lld" : "%lld", ans[i]);
58             }cout << endl;
59         }
60     }
61     return 0;
62 }

 

posted @ 2021-07-15 13:05  听说福建人很好吃  阅读(39)  评论(0)    收藏  举报