2018年全国多校算法寒假训练营练习比赛(第一场)

时间:2022-06-14 12:48:13

A

存的时候种类相同的配件保存最大加成的那个,然后枚举一下。

2018年全国多校算法寒假训练营练习比赛(第一场)2018年全国多校算法寒假训练营练习比赛(第一场)
 1 //A
2 #include <bits/stdc++.h>
3 using namespace std;
4
5 #define PI acos(-1.0)
6 #define INF 0x3f3f3f3f
7 #define FAST_IO ios::sync_with_stdio(false)
8 #define CLR(arr,val) memset(arr,val,sizeof(arr))
9
10 typedef long long LL;
11
12 int main(){
13 int n,m,k,x;
14 double tmp;
15 while(scanf("%d %d",&n,&m)!=EOF){
16 double p[1234];
17 vector <int> v[1234];
18 map <int,double> M;
19 for(int i=1;i<=n;i++){
20 scanf("%lf %d",&p[i],&k);
21 for(int j=1;j<=k;j++){
22 cin>>x;
23 v[i].push_back(x);
24 }
25 }
26 for(int i=1;i<=m;i++){
27 scanf("%d %lf",&x,&tmp);
28 if(tmp>M[x]) M[x]=tmp;
29 }
30 double ans=0;
31 for(int i=1;i<=n;i++){
32 double temp=1;
33 int len=v[i].size();
34 for(int j=0;j<len;j++){
35 temp+=M[v[i][j]];
36 }
37 ans=max(ans,p[i]*temp);
38 }
39 printf("%.4f\n",ans);
40 }
41
42 return 0;
43 }
View Code

B

用栈模拟一下过程,中途如果出现当前牌的发动速度小于前一张牌,把前面计算出来,出栈。最后再记得计算一次,计算过程按题目中的模拟即可。

2018年全国多校算法寒假训练营练习比赛(第一场)2018年全国多校算法寒假训练营练习比赛(第一场)
 1 //B
2 #include <bits/stdc++.h>
3 using namespace std;
4
5 #define PI acos(-1.0)
6 #define INF 0x3f3f3f3f
7 #define FAST_IO ios::sync_with_stdio(false)
8 #define CLR(arr,val) memset(arr,val,sizeof(arr))
9
10 typedef long long LL;
11 struct TnT{
12 int s,t,x;
13 }T;
14
15 LL ans;
16 stack <TnT> st;
17
18 LL cal(){
19 LL res=0;
20 while(!st.empty()){
21 TnT t=st.top();
22 st.pop();
23 if(t.t==1) ans+=t.x;
24 else if(t.t==2) ans+=t.x*(st.size()+1);
25 else if(t.t==3) while(!st.empty()) st.pop();
26 else if(t.t==4){
27 if(!st.empty()) st.pop();
28 }
29 }
30 return res;
31 }
32
33 int main(){
34 int n;
35 while(cin>>n){
36 ans=0;
37 while(n--){
38 cin>>T.s>>T.t;T.x=0;
39 if(T.t<=2) cin>>T.x;
40 if(st.empty()) st.push(T);
41 else if(st.top().s<=T.s) st.push(T);
42 else ans+=cal(),st.push(T);
43 }
44 ans+=cal();
45 cout<<ans<<endl;
46 }
47 return 0;
48 }
View Code

E

搜索,用邻接表建个图,然后DFS跑图。过程中标记卡片,如果卡片没被用过,记录的量+卡片的花费,否则继续往下跑,跑到目的地时更新一下花费。

2018年全国多校算法寒假训练营练习比赛(第一场)2018年全国多校算法寒假训练营练习比赛(第一场)
 1 //E
2 #include <bits/stdc++.h>
3 using namespace std;
4
5 #define PI acos(-1.0)
6 #define INF 0x3f3f3f3f
7 #define FAST_IO ios::sync_with_stdio(false)
8 #define CLR(arr,val) memset(arr,val,sizeof(arr))
9
10 typedef long long LL;
11 int M[123][123];
12 int vis[123];
13 set <int> st;
14 map <int,int> MA;
15 vector < pair<int,int> > E[123];
16 int ans;
17
18 void DFS(int u,int t,int tot){
19 if(u==t){
20 ans=min(ans,tot);
21 return ;
22 }
23 int len=E[u].size();
24 for(int i=0;i<len;i++){
25 int v=E[u][i].first;
26 int w=E[u][i].second;
27 if(!vis[w]){
28 vis[w]=1;
29 DFS(v,t,tot+MA[w]);
30 vis[w]=0;
31 }
32 else DFS(v,t,tot);
33 }
34 }
35
36 int main(){
37 int n,m,k,c;
38 int u,v,e,a,b;
39 while(scanf("%d %d %d %d",&n,&m,&k,&c)!=EOF){
40 CLR(vis,0);
41 for(int i=0;i<=122;i++) E[i].clear();
42 for(int i=1;i<=m;i++){
43 scanf("%d %d %d",&u,&v,&e);
44 E[u].push_back(make_pair(v,e));
45 }
46 for(int i=1;i<=k;i++){
47 scanf("%d %d",&a,&b);
48 MA[a]=b;
49 }
50 ans=INF;DFS(1,c,0);
51 cout<<ans<<endl;
52 }
53 return 0;
54 }
View Code

F

直接模拟过程,如果假设走下一步,下一步走完血量小于等于6a,那么这个时候一定要停下来吃血包;题目中有个注意点,如果最后一秒他能跑进安全区,那么也不会挂,(只要在最后一秒前有血)这个拿出来单独考虑一下。

2018年全国多校算法寒假训练营练习比赛(第一场)2018年全国多校算法寒假训练营练习比赛(第一场)
 1 //F
2 #include <bits/stdc++.h>
3 using namespace std;
4
5 #define PI acos(-1.0)
6 #define INF 0x3f3f3f3f
7 #define FAST_IO ios::sync_with_stdio(false)
8 #define CLR(arr,val) memset(arr,val,sizeof(arr))
9
10 typedef long long LL;
11
12 int main(){
13 int t;
14 cin>>t;
15 while(t--){
16 int a,b,c,x=100;
17 cin>>a>>b>>c;
18 while(b--&&b>0){
19 x-=a;
20 if(x-a<=6*a&&c>0){
21 c--;
22 x-=6*a;x=80;
23 }
24 }
25 if(x>0) cout<<"YES"<<endl;
26 else cout<<"NO"<<endl;
27 }
28
29 return 0;
30 }
View Code

G

室友的有情赞助(直接看代码吧

2018年全国多校算法寒假训练营练习比赛(第一场)2018年全国多校算法寒假训练营练习比赛(第一场)
 1 #include <bits/stdc++.h>
2 using namespace std;
3
4 #define ll long long
5 #define PI acos(-1)
6 #define eps 1e-10
7 #define mem(x) memset(x,0,sizeof(x))
8 #define _for(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
9 #define __for(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
10 ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
11 ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
12 ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
13
14 const int INF=0x3f3f3f3f;
15 const int MAX=1e5+5;
16 const int MOD=1e9+7;
17
18 int t,n;
19 char pic[17000][2200];
20
21 void draw(int x,int y,int n){
22 if(n==1){
23 pic[x][y-1]=pic[x+2][y-1]='O';
24 pic[x+1][y]=pic[x+1][y-2]='O';
25 return ;
26 }
27 ll d=pow(3,n-1);
28 draw(x,y,n-1);
29 draw(x+d,y-d,n-1);
30 draw(x+d,y+d,n-1);
31 draw(x+2*d,y,n-1);
32 }
33
34 int main(){
35 cin>>t;
36 while(t--){
37 cin>>n;
38 if(n==0) cout<<"O"<<endl;
39 else{
40 ll t=1;
41 _for(i,1,n-1){
42 t+=pow(3,i);
43 }
44 ll h=pow(3,n);
45 _for(i,1,h){
46 _for(j,1,t+h){
47 pic[i][j]=' ';
48 }
49 }
50 draw(1,h,n);
51
52 _for(i,1,h){
53 int pos=0;
54 _for(j,t,t+h){
55 if(pic[i][j]=='O') pos=j;
56 }
57 pic[i][pos+1]='z';
58 }
59 _for(i,1,h){
60 _for(j,t,t+h){
61 if(pic[i][j]=='z') break;
62 cout<<pic[i][j];
63 }
64 cout<<endl;
65 }
66 }
67 }
68 }
View Code

H

斐波那契数列

2018年全国多校算法寒假训练营练习比赛(第一场)2018年全国多校算法寒假训练营练习比赛(第一场)
 1 //H
2 #include <bits/stdc++.h>
3 using namespace std;
4
5 #define PI acos(-1.0)
6 #define INF 0x3f3f3f3f
7 #define FAST_IO ios::sync_with_stdio(false)
8 #define CLR(arr,val) memset(arr,val,sizeof(arr))
9
10 typedef long long LL;
11
12 LL F[123];
13
14 int main(){
15 F[0]=1;F[1]=1;
16 for(int i=2;i<123;i++) F[i]=F[i-1]+F[i-2];
17 int t;
18 cin>>t;
19 while(t--){
20 int n;
21 cin>>n;
22 cout<<F[n]<<endl;
23 }
24
25 return 0;
26 }
View Code

I

暴力模拟

2018年全国多校算法寒假训练营练习比赛(第一场)2018年全国多校算法寒假训练营练习比赛(第一场)
 1 //I
2 #include <bits/stdc++.h>
3 using namespace std;
4
5 #define PI acos(-1.0)
6 #define INF 0x3f3f3f3f
7 #define FAST_IO ios::sync_with_stdio(false)
8 #define CLR(arr,val) memset(arr,val,sizeof(arr))
9
10 typedef long long LL;
11
12 int main(){
13 int t,a,b;
14 scanf("%d",&t);
15 while(t--){
16 map <int,int> m;
17 scanf("%d %d",&a,&b);
18 int ta=a,tb=b;
19 while(ta){
20 m[ta%10]=1;
21 ta/=10;
22 }
23 while(tb){
24 m[tb%10]=1;
25 tb/=10;
26 }
27 int cnt=0;
28 for(int i=1;i<=1000;i++){
29 int tmp=i,idx=0;
30 while(tmp){
31 if(m[tmp%10]==1) {idx=1;break;}
32 tmp/=10;
33 }
34 if(i%a==0||i%b==0) idx=1;
35 if(idx==0) cnt++;
36 }
37 printf("%d\n",cnt);
38 }
39
40 return 0;
41 }
View Code

J

官方解释:找规律,奇数层会得到一个0,偶数层会得到3个0,每i+2个数i会合并为一个i+1,两个0合并为一个1,三个1合并为一个2...(膜膜膜室友...

2018年全国多校算法寒假训练营练习比赛(第一场)2018年全国多校算法寒假训练营练习比赛(第一场)
 1 #include <bits/stdc++.h>
2 using namespace std;
3
4 #define PI acos(-1.0)
5 #define INF 0x3f3f3f3f
6 #define FAST_IO ios::sync_with_stdio(false)
7 #define CLR(arr,val) memset(arr,val,sizeof(arr))
8 #define mem(x) memset(x,0,sizeof(x))
9 #define _for(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
10 #define __for(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
11
12 const int MAX=1e6+5;
13
14 int dp[MAX];
15
16 int t,n;
17 int cnt=0;
18
19 int main(){
20 cin>>t;
21 while(t--){
22 cin>>n;
23 mem(dp);
24 cnt=0;
25 string ans;
26 dp[0]+=n;
27 dp[1]+=n/2;
28 _for(j,0,cnt){
29 if(dp[j]>=j+2){
30 dp[j+1]+=dp[j]/(j+2);
31 dp[j]%=j+2;
32 cnt=max(cnt,j+1);
33 }
34 }
35 __for(j,cnt,0){
36 _for(k,1,dp[j]){
37 ans=ans+char(j+'0');
38 }
39 }
40 cout<<ans<<endl;
41 }
42 }
View Code