除了第一个题较水,后两个题还是有点难度
题目 A: 玩具迷题
一个模拟题,没什么好说的
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn =1e5+10; 5 6 int n,m; 7 8 char mz[maxn][12]; 9 int zx[maxn]; 10 int main(){ 11 scanf("%d%d",&n,&m); 12 for(int i=1;i<=n;i++){ 13 scanf("%d",zx+i); 14 scanf("%s",mz[i]); 15 } 16 int pos=1; 17 for(int i=1;i<=m;i++){ 18 int a,b; 19 scanf("%d%d",&a,&b); 20 if(a==0) { 21 if(zx[pos]==0){ 22 pos-=b;if(pos<1) { 23 pos%=n;pos+=n; 24 } 25 } 26 else { 27 pos+=b;if(pos>n) pos%=n; 28 } 29 } 30 else { 31 if(zx[pos]==0){ 32 pos+=b;if(pos>n) pos%=n; 33 } 34 else { 35 pos-=b;if(pos<1) pos%=n,pos+=n; 36 } 37 } 38 } 39 printf("%s",mz[pos]); 40 return 0; 41 }
题目 B: 天天爱跑步
这道题还是没写出来,只会用暴力骗分。。。
题目 C: 换教室
一个期望dp,当时没怎么做过期望dp的题,所以这题也只能骗分了
考完后讲了思路,调了一下午才调出来,很多细节的问题
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 2010; 4 inline int read(){ 5 int x=0,f=1;char ch=getchar(); 6 while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();} 7 while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();} 8 return x*f; 9 } 10 11 int n,m,v,e,c[maxn],d[maxn],dis[310][310]; 12 13 double k[maxn],dp[maxn][maxn][2]; 14 15 int main(){ 16 freopen("in.txt","r",stdin); 17 n=read(),m=read(),v=read(),e=read(); 18 for(int i=1;i<=n;i++) c[i]=read(); 19 for(int i=1;i<=n;i++) d[i]=read(); 20 for(int i=1;i<=n;i++) scanf("%lf",k+i); 21 memset(dis,0x3f,sizeof(dis)); 22 for(int i=1;i<=v;i++) dis[i][i]=0; 23 for(int i=1;i<=e;i++){ 24 int x=read(),y=read(); 25 dis[x][y]=dis[y][x]=min(dis[x][y],read()); 26 } 27 for(int kk=1;kk<=v;kk++) 28 for(int i=1;i<=v;i++) 29 for(int j=1;j<=v;j++) 30 dis[i][j]=min(dis[i][j],dis[i][kk]+dis[kk][j]); 31 for(int i=1;i<=n;i++) 32 for(int j=0;j<=m;j++) dp[i][j][0]=dp[i][j][1]=999999999; 33 dp[1][0][0]=dp[1][1][1]=0; 34 for(int i=2;i<=n;i++){ 35 for(int j=0;j<=min(i,m);j++){ 36 dp[i][j][0]=min(dp[i-1][j][0]+dis[c[i-1]][c[i]],dp[i-1][j][1]+dis[d[i-1]][c[i]]*k[i-1]+dis[c[i-1]][c[i]]*(1-k[i-1])); 37 if(j!=0) 38 dp[i][j][1]=min(dp[i-1][j-1][0]+dis[c[i-1]][d[i]]*k[i]+dis[c[i-1]][c[i]]*(1-k[i]), 39 dp[i-1][j-1][1]+dis[d[i-1]][d[i]]*k[i-1]*k[i]+dis[d[i-1]][c[i]]*k[i-1]*(1-k[i])+dis[c[i-1]][d[i]]*k[i]*(1-k[i-1])+dis[c[i-1]][c[i]]*(1-k[i])*(1-k[i-1])); 40 } 41 } 42 double ans=999999999; 43 for(int i=0;i<=m;i++) ans=min(dp[n][i][0],min(dp[n][i][1],ans)); 44 printf("%.2f",ans); 45 return 0; 46 }