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 }

浙公网安备 33010602011771号