天天看点

CSP2016-09

  CSP201609-1 最大波动

CSP2016-09
CSP2016-09
CSP2016-09
CSP2016-09
1 //
 2 //  main.cpp
 3 //  CSP201609-1 最大波动
 4 //
 5 //  Created by sylvia on 2021/11/2.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <math.h>
11 #include <algorithm>
12 using namespace std;
13 int main(){
14     int n,x,y,ans=-1;
15     cin>>n>>x;
16     y=x;
17     n--;
18     while (n--){
19         cin>>x;
20         ans=max(ans,abs(x-y));
21         y=x;
22     }
23     cout<<ans<<endl;
24     return 0;
25 }      

View Code

  CSP201609-2 火车购票

CSP2016-09
CSP2016-09

 家人们,太丢人了,写了这么多年代码,第一次用双判断的for循环语句,忘了写&&,结果咋交都是90'

又是当????的一天呢

CSP2016-09
CSP2016-09
1 //
 2 //  main.cpp
 3 //  CSP201609-2 火车购票
 4 //
 5 //  Created by sylvia on 2021/11/2.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <stdio.h>
11 #include <math.h>
12 #include <algorithm>
13 #include <string.h>
14 using namespace std;
15 #define M 20+5
16 int a[M];
17 int flag;
18 int main(){
19     memset(a,0,sizeof(a));
20     int n,p;
21     cin>>n;
22     while (n--){
23         cin>>p;
24         flag=0;
25         for (int i=0;i<=19&&flag==0;i++){
26             if (5-a[i]>=p){
27                 for(int j=1;j<=p;j++){
28                     cout<<a[i]+i*5+j<<' ';
29                 }
30                 flag=1;
31                 a[i]+=p;
32                 cout<<endl;
33             }
34         }
35         if(!flag){
36             for (int i=0;i<=19&&flag==0;i++) {
37                 if(a[i]<5){
38                     for (int j=1;j<=min(5-a[i],p);j++){
39                         cout<<a[i]+i*5+j<<' ';
40                     }
41                     p-=(5-a[i]);
42                     if(p<=0) flag=1;
43                     a[i]=5;
44                 }
45             }
46             cout<<endl;
47         }
48     }
49 }      

View Code

  CSP201609-3 炉石传说

CSP2016-09
CSP2016-09
CSP2016-09
CSP2016-09
CSP2016-09

 一看这种题干又臭又长的题目就知道大概率是个大模拟,当然这比起来近几年csp的题目已经算短的了,也确实是个小模拟,关键在于如何处理插入的随从,使用数组肯定行不通,每次插入会导致后面的数据后移,使用指针算是一种可行选择,但是指针其实挺容易写错的,于是我就想到了vector里面有没有相关的可以用呢?

当然!

使用insert和erase就会让这个题变得超级简单,当然,菜菜如我,起初只拿了50‘,还不是因为粗心大意读错了题目,没有理解到“当随从攻击时,攻击方和被攻击方会同时对彼此造成等同于自己攻击力的伤害。”这句话的含义,然后改了一处后80‘……不得不说这数据水的可以,我都没改全就能多拿30分……

再次提一提,struct内定义结构函数进行初始化

15struct character{
16     int life;
17     int aggre;
18     character(int l,int a):life(l),aggre(a){}
19 };      

insert使用戳这里

简单来讲就是a.insert(位置,元素)

erase使用戳这里两种用法:

  • 删除第n个元素

a.erase(a.begin()+5);

//erase the 6th element

  • 删除第n-n+m个元素
1 //
 2 //  main.cpp
 3 //  CSP201609-3 炉石传说
 4 //
 5 //  Created by sylvia on 2021/11/3.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <vector>
11 #include <string.h>
12 #include <string>
13 using namespace std;
14 #define M 1000+5
15 struct character{
16     int life;
17     int aggre;
18     character(int l,int a):life(l),aggre(a){}
19 };
20 vector <character> a[2];
21 int n;
22 string c;
23 int main(){
24     cin>>n;
25     int sit,lif,agg,j=0;
26     a[0].push_back(character(30,0));
27     a[1].push_back(character(30,0));
28     for (int i=1;i<=n;i++){
29         cin>>c;
30         if(c=="end"){
31             j=(j+1)%2;
32         }
33         else if(c=="summon"){
34             cin>>sit>>agg>>lif;
35             a[j].insert(a[j].begin()+sit,character(lif,agg));
36         }
37         else if(c=="attack"){
38             cin>>sit>>agg;
39             a[j][sit].life-=a[(j+1)%2][agg].aggre;
40             a[(j+1)%2][agg].life-=a[j][sit].aggre;
41             if(a[j][sit].life<=0&& sit!=0){
42                 a[j].erase(a[j].begin()+sit);
43             }
44             if(a[(j+1)%2][agg].life<=0 &&agg!=0){
45                 a[(j+1)%2].erase(a[(j+1)%2].begin()+agg);
46             }
47         }
48     }
49     if(a[0][0].life>0&&a[1][0].life>0) cout<<0<<endl;
50     else if(a[0][0].life<=0) cout<<-1<<endl;
51     else cout<<1<<endl;
52     for (int j=0;j<=1;j++){
53         cout<<a[j][0].life<<endl;
54         cout<<a[j].size()-1<<' ';
55         for (int i=1;i<a[j].size();i++){
56             cout<<a[j][i].life<<' ';
57         }
58         cout<<endl;
59     }
60     return 0;
61 }