2019/2/13测试(noip2016提高组day1原题)

除了第一个题较水,后两个题还是有点难度

题目 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 }
View Code

猜你喜欢

转载自www.cnblogs.com/plysc/p/10371700.html