2021/07/14/C CodeForces - 1249B2
阿新 • • 發佈:2021-07-15
已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 }