1. 程式人生 > 其它 >2021/07/14/C CodeForces - 1249B2

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 }