发烧使人头大,应该是我做过的最差的一次模拟赛了,尽管这次模拟赛里面全是模拟和搜索。难得每道题都能在网上搜到(终于发现ywd收手机的意义了),那我就不用把题全部复制上了。传送门:
T1:https://www.luogu.org/problemnew/show/P1148
这题比的是细心,每种状况的处理都要注意,基本有几点,有所有红桃但是C10和D11只有其中一张时之后要减(我90就死在这儿),尽管我不知道有没有其他牌但我对这个地方还是做了一个判断,忽视无意义的牌,另外的就按照他说的做好了。附上代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char s1[101][101];
int h[100]={0,-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40},s[100]={0},d[100]={0},c[100]={0};
int sum[101]={0},n[101]={0};
int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,tmp=0,vis;
int main()
{
int i,j,k;
memset(sum,0,sizeof(sum));
while(1)
{
for(i=1;i<=4;i++)
{
scanf("%d",&n[i]);vis=13;flag1=0;flag2=0;flag3=0;flag4=0;flag5=0;tmp=0;
if(n[i]==0) continue;
for(j=1;j<=n[i];j++)
{
scanf("%s",s1[j]);
if(s1[j][0]=='C')
{
if(s1[j][1]=='1'&&s1[j][2]=='0')
flag1=1;
continue;
}
if(s1[j][0]=='S')
{
flag5=1;
if(s1[j][1]=='1'&&s1[j][2]=='2')
{
flag2=1;
sum[i]-=100;
}
continue;
}
if(s1[j][0]=='D')
{
flag5=1;
if(s1[j][1]=='1'&&s1[j][2]=='1')
{
sum[i]+=100;
flag3=1;
}
continue;
}
if(s1[j][0]=='H')
{
flag5=1;
for(k=1;k<strlen(s1[j]);k++)
tmp=tmp*10+(s1[j][k]-'0');
sum[i]+=h[tmp];vis--;
tmp=0;
}
}
if(vis==0)
if(flag2==1&&flag3==1)
sum[i]=500;
else {
sum[i]=200;
if(flag2==1)
sum[i]-=100;
else if(flag3==1)
sum[i]+=100;
}
if(flag1==1&&flag5==1)
sum[i]*=2;
else if(flag1==1&&flag5==0)
sum[i]=50;
}
if(n[1]==0&&n[2]==0&&n[3]==0&&n[4]==0)
break;
for(i=1;i<=4;i++)
if(sum[i]<=0)
printf("%d ",sum[i]);
else if(sum[i]>0)
printf("+%d ",sum[i]);
printf("\n");
memset(sum,0,sizeof(sum));
}
return 0;
}
T2:https://www.luogu.org/problemnew/show/P1188
据说有高级数据结构可以解决但我不会,所以只能暴力模拟了,粗算了一下复杂度觉得ok然而全部wa,等之后ac后再来填坑。
T3:https://www.luogu.org/problemnew/show/P1189
超生气的这题,这题我觉得应该不会超时就没加记忆化,然后30分,回家加了个超没诚意的记忆化ac了,附上代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char s1[1001][1001],s2[10001];
int vis[101][101]={0},w[101][101]={0},step[10001]={0},vis1[101][101][1010]={0};
int dx[10]={0,-1,1,0,0},dy[10]={0,0,0,-1,1};
int r,c,n;
int dfs(int i,int dirnum,int x,int y)
{
int j;
j=step[dirnum];
if(vis1[x][y][dirnum]==1)
return 0;
vis1[x][y][dirnum]=1;
if(dirnum==n)
{
vis[x][y]=1;
}
if(x+dx[j]>=1&&x+dx[j]<=r&&y+dy[j]>=1&&y+dy[j]<=c&&w[x+dx[j]][y+dy[j]]==0)
{
dfs(i+1,dirnum,x+dx[j],y+dy[j]);
}
if(dirnum==n)
return 0;
j=step[dirnum+1];
if(x+dx[j]>=1&&x+dx[j]<=r&&y+dy[j]>=1&&y+dy[j]<=c&&w[x+dx[j]][y+dy[j]]==0)
{
dfs(i+1,dirnum+1,x+dx[j],y+dy[j]);
}
return 0;
}
int main()
{
int i,j,cx,cy;
scanf("%d%d",&r,&c);
for(i=1;i<=r;i++)
{
scanf("%s",s1[i]);
for(j=0;j<strlen(s1[i]);j++)
if(s1[i][j]=='X')
w[i][j+1]=1;
else if(s1[i][j]=='*')
{
cx=i;cy=j+1;
}
}
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s",s2);
if(s2[0]=='N')
step[i]=1;
else if(s2[0]=='S')
step[i]=2;
else if(s2[0]=='W')
step[i]=3;
else if(s2[0]=='E')
step[i]=4;
}
s1[cx][cy-1]='.';
cx=cx+dx[step[1]];
cy=cy+dy[step[1]];
dfs(1,1,cx,cy);
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
if(vis[i][j]==1)
s1[i][j-1]='*';
}
for(i=1;i<=r;i++)
printf("%s\n",s1[i]);
return 0;
}
T4:https://www.luogu.org/problemnew/show/P1156
emmm我能说我一看这题就觉得是个dp但我从来没想出过转移方程呢,最后听说是个01背包心态爆炸,当时应该再想一想而不是强行打搜索(这个搜索我倒加了最优化判断然而没用),只能附上可怜的20分代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
FILE*fin,*fout;
int t[100001]={0},f[100001]={0},h[100001]={0};
int d,g,hei=0,min=1000000,en,flag=0;
int dfs(int i)
{
if(en<0) return 0;
if(i==g+1)
{
if(hei>=d)
{
flag=1;
if(i<min)
min=i-1;
return 0;
}
return 0;
}
if(hei>=d)
{
flag=1;
if(i<min)
min=i-1;
return 0;
}
en=en-(t[i]-t[i-1]);
if(i>=min)
return 0;
if(hei>=d)
{
flag=1;
if(i<min)
min=i-1;
return 0;
}
if(i>=g+1)
return 0;
en+=f[i];
dfs(i+1);
en-=f[i];
hei+=h[i];
dfs(i+1);
hei-=h[i];
en=en+(t[i]-t[i-1]);
return 0;
}
int main()
{
int i;
fin=fopen("well.in","r");
fout=fopen("well.out","w");
fscanf(fin,"%d%d",&d,&g);
memset(f,0,sizeof(f));
memset(t,0,sizeof(t));
memset(h,0,sizeof(h));
for(i=1;i<=g;i++)
{
fscanf(fin,"%d%d%d",&t[i],&f[i],&h[i]);
}
en=10;
dfs(1);
if(flag==1)
fprintf(fout,"%d",t[min]);
else
{
en=10;
for(i=1;i<=g;i++)
{
en-=(t[i]-t[i-1]);
en+=f[i];
if(en<=0)
{
fprintf(fout,"%d",t[i-1]+f[i-1]);
return 0;
}
}
fprintf(fout,"%d",t[g-1]+f[g]);
}
fclose(fin);
fclose(fout);
return 0;
}
dp,搜索,模拟这块水平还是太差,还需要提高,另外,永远不要在生病的时候打比赛!!!