码迷,mamicode.com
首页 > 其他好文 > 详细

时间复杂度(模拟)

时间:2019-11-06 20:01:56      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:lse   tin   循环   pac   empty   oid   class   algorithm   other   

满分做法:

不难发现,可以用树形结构递归求解,在此说一些易错点。

1.要用双端队列储存第几个循环。

2.读到E时就队尾,如果已经空了,就是ERR。注意每次要把循环下标清零。

3.当x,y都是n,他是o1的,可以往下搜索。

#include<map>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<deque>
using namespace std;
int t;
int l;
char fzd[10];
int num;
bool flag;
char b[210];
map<char,bool> mp;
deque<int> q; 
int tot,pre[210],last[210],other[210],w[210];
void add(int x,int y)
{
 tot++;
 pre[tot]=last[x];
 last[x]=tot;
 other[tot]=y; 
}
int dfs(int x)
{
 int tmp=w[x],sum=0;
 for(int p=last[x];p;p=pre[p])
 {
  int v=other[p];
  if(w[v]==-1) continue;
  sum=max(sum,dfs(v));
 }
 return tmp+sum;
}
int main()
{
 scanf("%d",&t);
 while(t--)
 {
   tot=0;
   q.clear();
   memset(last,0,sizeof(last));
   memset(w,0,sizeof(w));
   flag=0;
   num=0;
   mp.clear();
   scanf("%d",&l);
   scanf(" O(%s)",fzd+1);
   int len=strlen(fzd+1);
   if(len==1) num=0;
   else
   {
     for(int i=3;i<=len-1;i++)
     num*=10,num+=fzd[i]-'0';
   }
   for(int i=1;i<=l;i++)
   {
     char s;
     cin>>s;
     if(s=='F')
     {
       cin>>b[i];
       if(mp[b[i]])
       flag=1;
       mp[b[i]]=1;
       char kai[5],ed[5];
       scanf("%s",kai+1);
       scanf("%s",ed+1);
       int l1=strlen(kai+1);
       int l2=strlen(ed+1);
       int num1=0,num2=0;
       for(int j=1;j<=l1;j++)
       {
         if(kai[j]=='n')
         {
            w[i]=-1;
            continue;   
         }
         num1*=10;
         num1+=kai[j]-'0';
       }
       for(int j=1;j<=l2;j++)
       {
          if(ed[j]=='n')
          {
             if(kai[1]!='n')
             w[i]=1;
          }
          num2*=10;
          num2+=ed[j]-'0';
       }
       if(w[i]==0)
       {
         if(num1<=num2)
         w[i]=0;
         else w[i]=-1;
       }
       if(kai[1]=='n'&&ed[1]=='n')
       w[i]=0;
       if(q.size()) add(q.back(),i);
       if(q.empty()) add(0,i);
       q.push_back(i);
     }
     else
     {
      if(q.empty())
      {
       flag=1;
       continue;
      }
      mp[b[q.back()]]=0;
      q.pop_back();
     }
   }
   if(flag||q.size())
   {
     printf("ERR\n");
     continue;
   }
   int ans=dfs(0);
   if(ans==num)
   printf("Yes\n");
   else 
   printf("No\n");
 }
 return 0;  
}

时间复杂度(模拟)

标签:lse   tin   循环   pac   empty   oid   class   algorithm   other   

原文地址:https://www.cnblogs.com/lihan123/p/11808165.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!