1. 程式人生 > >第十二屆西科大程序設計競賽心得(菜菜的

第十二屆西科大程序設計競賽心得(菜菜的

程序設計 ace names 矩陣 ise AS main algorithm ostream

首先,選了一道在題目列表裏名字不太一樣的題來做, G. ACMer的榮耀。

這道題有兩點沒註意到:其一是開始時想成了10以內的運算,沒有分解整數。其二是沒有註意分解整數裏的while跳出條件i=0時也是要加上6的。導致交了5遍才對。。。

 1 #include <cstdio>
 2 typedef long long ll;
 3 int a[10]={6,2,5,5,4,5,6,3,7,6};
 4 
 5 int main(void){
 6     int q;
 7     ll ans;
 8     while (scanf("%d", &q)!=EOF){
9 int l, r; 10 while (q--){ 11 ans=0; 12 scanf("%d%d", &l, &r); 13 for (int i=l; i<=r; i++){ 14 int num; 15 int ii=i; 16 if (i==0){ 17 ans+=6; 18 } 19 while
(ii){ 20 num = ii%10; 21 //printf("+%d ", a[num]); 22 ans+=a[num]; 23 ii/=10; 24 } 25 } 26 printf("%lld\n", ans); 27 } 28 } 29 return 0; 30 }

緊接著做了A題

學了一點map,邊學邊寫出來的,map和set容器都會將裏面的數據按字典序排序。還學到了用String類型的時候要寫一個#include<string>的頭文件。

 1 #include <cstdio>
 2 #include <map>
 3 #include <string>
 4 #include <algorithm>
 5 #include <iostream>
 6 using namespace std;
 7 
 8 map<string, int> c;
 9 
10 int main(void){
11     int n;
12     while (scanf("%d", &n)!=EOF){
13         int score;
14         string s;
15         for (int i=0; i<n; i++){
16             cin>>s>>score;
17             if (c[s] < score){
18                 c[s]=score;
19             }
20         }
21         for (map<string,int>::iterator it = c.begin(); it!=c.end(); ++it){
22             cout<<it->first<<" "<<it->second<<endl;
23         }
24         c.clear();
25     }
26 
27     return 0;
28 }

寫轟炸面積最多是多少那道題時,總感覺似曾相識,跟以前一道求坐標系上面積的題很像。那道題就是講坐標系變成一個n*n的矩陣,然後標記上就行了。這道題我覺得很坑的是不能在n*n中遍歷,因為你不知道輸入的左下角,右上角坐標的最大值,n並不是界限,只是表示個數。所以我就用邊界來遍歷了,也就是101*101,i、j的範圍都在【0,101)。

 1 #include <cstdio>
 2 #include <map>
 3 #include <string>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <iostream>
 7 using namespace std;
 8 
 9 struct node{
10     int x1;
11     int y1;
12     int x2;
13     int y2;
14 }node[105];
15 
16 int cnt[105][105];
17 
18 int main(void){
19     int n;
20     while (scanf("%d", &n)!=EOF){
21         for (int i=0; i<n; i++){
22             scanf("%d%d%d%d", &node[i].x1, &node[i].y1, &node[i].x2, &node[i].y2);
23         }
24         memset(cnt, 0, sizeof(cnt));
25         for (int i=0; i<n; i++){
26             int lx, rx, ly, ry;
27             lx=node[i].x1; rx=node[i].x2;
28             ly=node[i].y1; ry=node[i].y2;
29             for (int k=lx; k<rx; k++){
30                 for (int j=ly; j<ry; j++){
31                     cnt[k][j]++;
32                 }
33             }
34         }
35         /*
36         printf("cnt: \n");
37         for (int i=0; i<101;i++){
38             for (int j=0; j<101;j++){
39                printf("%d ", cnt[i][j]);
40             }
41             printf("\n");
42         }*/
43 
44         int m=0;
45         for (int i=0; i<101;i++){
46             for (int j=0;j<101; j++){
47                if (cnt[i][j]>m){
48                     m=cnt[i][j];
49                }
50             }
51         }
52         printf("%d\n", m);
53     }
54 
55     return 0;
56 }

看了題解之後 補了移動的反應堆那道簽到題。。不知道對不對

 1 #include <cstdio>
 2 #include <map>
 3 #include <set>
 4 #include <string>
 5 #include <cstring>
 6 #include <algorithm>
 7 #include <iostream>
 8 using namespace std;
 9 int a[100005];
10 multiset<int> muls;
11 
12 int main(void){
13     int n;
14     int ans=0;
15     while (scanf("%d", &n)!=EOF){
16        for (int i=0; i<n; i++){
17             scanf("%d", &a[i]);
18        }
19        for (int i=0; i<n; i++){
20             muls.insert(a[i]);
21             //printf("cnt = %d\n", muls.count(a[i]));
22             if (muls.count(a[i])==3){
23                 ans++;
24                 muls.clear();
25             }
26        }
27        printf("%d\n", ans);
28     }
29 
30     return 0;
31 }

打了比賽之後,學到了很多。終於從0,1,2道題,變成了3道題了~而且還學到了不少~開心~

第十二屆西科大程序設計競賽心得(菜菜的