20180922解题报告

发烧使人头大,应该是我做过的最差的一次模拟赛了,尽管这次模拟赛里面全是模拟和搜索。难得每道题都能在网上搜到(终于发现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,搜索,模拟这块水平还是太差,还需要提高,另外,永远不要在生病的时候打比赛!!!

猜你喜欢

转载自blog.csdn.net/qq_40892508/article/details/82815427