时间复杂度(模拟)

Posted lihan123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间复杂度(模拟)相关的知识,希望对你有一定的参考价值。

满分做法:

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

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
");
     continue;
   }
   int ans=dfs(0);
   if(ans==num)
   printf("Yes
");
   else 
   printf("No
");
 }
 return 0;  
}

以上是关于时间复杂度(模拟)的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的算法复杂度

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?

基于时间复杂度的这些片段真的很困惑

用于数据加载的 Android 活动/片段职责

iOS Swift 中的 Android 片段模拟

当我想模拟数据并测试 UI 片段时,doNothing() 不起作用