1. 程式人生 > 其它 >The 2021 ICPC Asia Regionals Online Contest (I)補題

The 2021 ICPC Asia Regionals Online Contest (I)補題

I Neiborhood Search

題意:簽到題

思路:主要是學習stringstream,記得加標頭檔案sstream

注:當時以為這個題會卡A的範圍,就開始找大數,因為最開始就是類似這樣寫的,沒有用stringstream,只是普通的讀入,後來才發現就是多空格的問題,但是比賽的時候一直以為是卡int和long long,也是夠了,後來還是隊友用的py寫出來的

程式碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5
#include<sstream> 6 #include<algorithm> 7 using namespace std; 8 const int maxx=1e5+10; 9 int main(){ 10 string s; 11 stringstream ss; 12 getline(cin,s); 13 ss<<s; 14 int a[maxx]; 15 int i=0; 16 int num; 17 while(ss>>num){ 18 a[i++]=num;
19 } 20 int sum=0; 21 int x,y; 22 scanf("%d %d",&x,&y); 23 sort(a,a+i); 24 for(int j=i-1;j>=0;j--){ 25 if(abs(x-a[j])<=y){ 26 sum--; 27 printf("%d ",a[j]); 28 } 29 } 30 printf("\n"); 31 32 }
View Code

F Land Overseer

題意:簽到題

思路:簡單幾何,一畫圖就出來

注:輸入的時候,雖然顯示是int型別的,但是還是要用double輸入

程式碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<sstream>
 6 #include<algorithm>
 7 using namespace std;
 8 const int maxx=1e5+10;
 9 int main(){
10     int t;
11     scanf("%d",&t);
12     int i=1;
13     while(t--){
14         double a,b,r;
15         scanf("%lf %lf %lf",&a,&b,&r);
16         double l;
17         if(b<=r){
18             l=2*a-r;
19         }else{
20             l=sqrt(a*a+(b-r)*(b-r));
21             l*=2;
22             l-=r;
23         }
24         printf("Case #%d: %.2f\n",i,l);
25         
26         i++;
27     }
28 
29 }
View Code

H Mesh Analysis

題意:簽到題

思路:直接用set就搞出來了

注:我吐了,當時讀完題和隊友說的思路就是對的,但是開始懷疑自己是不是做對了,因為如果按照這個思路的話,上面的點的座標是用不到的,結果他預判了我的預判,我們以為錯了的程式碼就是對的

程式碼:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<set>
 7 using namespace std;
 8 const int maxx=1e5+10;
 9 int main(){
10     int n,m;
11     scanf("%d %d",&n,&m);
12     getchar();
13 
14     for(int i=0;i<n;i++){
15         string x,y,z;
16         getline(cin,x);
17     }
18     int a[maxx][4];
19     for(int i=1;i<=m;i++){
20         int num;
21         int value;
22         scanf("%d %d",&num,&value);
23         if(value==102){
24             a[i][0]=2;
25             scanf("%d %d",&a[i][1],&a[i][2]);
26         }else{
27             a[i][0]=3;
28             scanf("%d %d %d",&a[i][1],&a[i][2],&a[i][3]);
29         }
30     }
31     scanf("%d",&n);
32     while(n--){
33         int num;
34         scanf("%d",&num);
35         set<int> b;
36         int j=0;
37         set<int> s;
38         int k=0;
39         for(int i=1;i<=m;i++){
40             if(a[i][0]==2){
41                 if(a[i][1]==num){
42 
43                     s.insert(i);
44                     b.insert(a[i][2]);
45                 }else if(a[i][2]==num){
46 
47                     b.insert(a[i][1]);
48                     s.insert(i);
49                 }
50             }else if(a[i][0]==3){
51                 if(a[i][1]==num){
52 
53                     s.insert(i);
54                     b.insert(a[i][2]);
55                     b.insert(a[i][3]);
56                 }else if(a[i][2]==num){
57 
58                     s.insert(i);
59                     b.insert(a[i][1]);
60                     b.insert(a[i][3]);
61                 }else if(a[i][3]==num){
62 
63                     s.insert(i);
64                     b.insert(a[i][1]);
65                     b.insert(a[i][2]);
66                 }
67             }
68         }
69         printf("%d\n",num);
70         if(b.size()==0){
71             printf("[]\n");
72             printf("[]");
73         }else{
74             printf("[");
75             set<int>::iterator it = b.begin();
76             printf("%d",*it);
77             it++;
78             for(; it != b.end(); it++){//定義前向迭代器遍歷輸出
79                 printf(",%d",*it);
80 
81             }
82             printf("]\n");
83             printf("[");
84             set<int>::iterator its = s.begin();
85             printf("%d",*its);
86             its++;
87              for(; its != s.end(); its++){
88                 printf(",%d",*its);
89 
90             }
91             printf("]");
92         }
93         if(n){
94             printf("\n");
95         }
96     }
97 }
View Code

K Segment Routing

題意:簡單的路徑問題

思路:主要是利用vector的resize和push_back(),

程式碼:

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<algorithm>
 7 
 8 using namespace std;
 9 
10 vector<vector<int>> r;
11 
12 
13 int main() {
14     int z; cin >> z;
15     for(int T = 1; T <= z; T++) {
16         int n, m; cin >> n >> m;
17         r.resize(n);
18         for(int i = 0; i < n; i++) {
19             int j; cin >> j;
20             r[i].clear();
21             for(int k = 0; k < j; k++) {
22                 int t; cin >> t;
23                 r[i].push_back(t-1);
24             }
25         }
26 
27         cout << "Case #" << T << ": \n";
28         for(int i = 0; i < m; i++) {
29             int s, l; cin >> s >> l;s--;
30             while(l--) {
31                 int e; cin >> e; e--;
32                 if(s < 0) continue;
33                 if(r[s].size() > e)
34                     s = r[s][e];
35                 else
36                     s = -1;
37             }
38             if(s < 0) {
39                 cout << "Packet Loss";
40             } else {
41                 cout << s+1;
42             }
43             if(i < m-1) cout << '\n'; 
44         }
45         if(T < z) cout << '\n';
46     }
47     cout << flush;
48     return 0;
49 }
View Code

好多資料結構的題目啊,感覺分完工以後作為一個數論選手一直在讀題翻譯,資料結構隊友程式碼敲得噼裡啪啦,邊改邊找板子,總而言之不是很順利。分完工以後自己主攻數學,感覺資料結構多的題目也是實在補不動,總覺得資料結構的程式碼好長,理解起來也好繁雜,不過確實資料結構的解題方法很巧妙,希望下次各種演算法和題型能夠均衡一點,希望下次題目也……,題目稀里嘩啦,輸入無用不知道什麼意義