第十二屆西科大程序設計競賽心得(菜菜的
阿新 • • 發佈:2018-04-16
程序設計 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道題了~而且還學到了不少~開心~
第十二屆西科大程序設計競賽心得(菜菜的