P3952 NOIP2017 时间复杂度
生活随笔
收集整理的這篇文章主要介紹了
P3952 NOIP2017 时间复杂度
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
寫了兩三個小時,麻煩倒是不麻煩,要考慮清楚,想全了
只過了樣例提交是不是傻,要自己造數(shù)據(jù)
數(shù)據(jù)不大可以用STL
建議自己剛一下,不看代碼
#include <iostream>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std;
int n;
char a[200][200];
int fuzadu;
int vis[30];
struct node {int zimu,id,fzd;node(int a,int b,int c) {zimu=a;id=b;fzd=c;}
//zimu是最后用來刪除的,id是check彈棧用的 ,fzd是判斷這個F是否能有貢獻(xiàn),是不是O(n)的
};
stack<node> sta;
void read()
{while(!sta.empty()) sta.pop();memset(a,0,sizeof(a));memset(vis,0,sizeof(vis));scanf("%d O(",&n);char s=getchar();if(s=='n') {scanf("^%d)",&fuzadu);} else fuzadu=0;while(s!='\n')s=getchar();for(int i=1;i<=n;++i)cin.getline(a[i]+1,'\n');
}
bool check(int &i,int dsr)
{++i;for(;i<=n;++i){if(a[i][1]=='F') //F {//處理 循環(huán)變量if(vis[a[i][3]-'a']) { //如果出現(xiàn)過的話,ERR return 1;} else {vis[a[i][3]-'a']=1; //vis數(shù)組++ sta.push(node(a[i][3]-'a',i,0));//加入棧 }} else { //E if(a[i][1]=='E') { //如果結(jié)束這個循環(huán) if(sta.empty()) { return 1;}//沒有對應(yīng)的F,ERR vis[sta.top().zimu]=0;// 這個F的字母以后可以用了 if(sta.top().id==dsr) {sta.pop();return 0;}sta.pop(); //在棧中刪除 }}}return 0;
}
void solve()
{read();int js=0;//時間復(fù)雜度 int ans=0;//最大復(fù)雜度 for(int i=1;i<=n;++i){if(a[i][1]=='F') //F {//處理 循環(huán)變量 if(vis[a[i][3]-'a']) { //如果出現(xiàn)過的話,ERR { puts("ERR");return;}} else {vis[a[i][3]-'a']=1; //vis數(shù)組++ }//F的范圍 int j=5,x=0,y=0;if(a[i][5]=='n') {sta.push(node(a[i][3]-'a',i,0));//一定不可能是復(fù)雜度一定不可能是O(1)的//如果第一個數(shù)是n,那么只有第二個數(shù)也是n才能進(jìn)入循環(huán)(復(fù)雜度O(1)),否則就直到彈棧為止if(a[i][7]!='n') { //只需要檢查是否ERR即可 if(check(i,i)) {puts("ERR");return;} }} else {while(a[i][j]>='0'&&a[i][j]<='9') {x=x*10+a[i][j]-'0';j++;} j++;//讀入xif(a[i][j]=='n') {sta.push(node(a[i][3]-'a',i,1));js++;//如果第1個是數(shù)字第2個是n,復(fù)雜度++ ans=max(ans,js); //更新最高復(fù)雜度 }else {sta.push(node(a[i][3]-'a',i,0));while(a[i][j]>='0'&&a[i][j]<='9') {y=y*10+a[i][j]-'0';j++;} j++;//如果都是數(shù)字,分為可以進(jìn)入和不可以進(jìn)入 if(x>y) {//不可以進(jìn)//只需要檢查是否ERR即可入if(check(i,i)) {puts("ERR");return;}}//可以進(jìn)入就不管啦,復(fù)雜度O(1) }} } else { //處理E if(a[i][1]=='E') { //如果結(jié)束這個循環(huán) if(sta.empty()) { puts("ERR");return;}//沒有對應(yīng)的F,ERR vis[sta.top().zimu]=0;// 這個F的字母以后可以用了 js-=sta.top().fzd;//這個復(fù)雜度也得--,所以要過程中取max sta.pop(); //在棧中刪除 }}} if(sta.size()) puts("ERR");else if(ans==fuzadu)puts("Yes");else puts("No");
}
int main()
{
// freopen("a.in","r",stdin);int T;scanf("%d",&T);while(T--)solve();return 0;
}
轉(zhuǎn)載于:https://www.cnblogs.com/dsrdsr/p/9548509.html
總結(jié)
以上是生活随笔為你收集整理的P3952 NOIP2017 时间复杂度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 戴尔笔记本电脑windows7壁纸在电脑
- 下一篇: 《感鹤》第十句是什么