括號匹配(棧 貪心)

2022-09-06 22:51:19 字數 1746 閱讀 7525

題目鏈結

題意:給出n個字串只包含「()」,問n個字串可以任意順序連線,最多有多少個括號匹配?

解法:首先統計單個字串中已經匹配的括號。

對於剩下的不匹配字串有三種情況:

( 左括號多於右括號

)( 左括號等於右括號

) 左括號小於右括號

排序:按照第一類、第二類和第三類字串相對順序擺放。具體第一類:對於同為第一類之間的排序規則為右括號更少的放前面。具體第三類:左括號多的放前面。

//#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll ;

#define int ll

#define mod 100

#define gcd(m,n) __gcd(m, n)

#define rep(i , j , n) for(int i = j ; i <= n ; i++)

#define red(i , n , j) for(int i = n ; i >= j ; i--)

#define me(x , y) memset(x , y , sizeof(x))

//int lcm(int a , int b)

//ll quickpow(ll a , ll b)return ans;}

//int euler1(int x)if(x>1)ans-=ans/x;return ans;}

//const int n = 1e7+9; int vis[n],prime[n],phi[n];int euler2(int n)for(int j=1;j#define fi first

#define se second

#define lson l,mid,root<<1

#define rson mid+1,r,root<<1|1

#define pb push_back

#define mp make_pair

#define all(v) v.begin(),v.end()

#define size(v) (int)(v.size())

#define cin(x) scanf("%lld" , &x);

const int n = 1e6+9;

const int maxn = 1e5+9;

const double esp = 1e-6;

char s[maxn];

int cnt ;

struct nodea[maxn];

bool cmp(node a , node b)

if(a.l < a.r && b.l >= b.r)

if(a.l >= a.r && b.l >= b.r)

if(a.r >= a.l && b.r >= b.l)//同樣是右括號多,左括號更多的放前面

return a.l > b.l;

}void solve()elseelse}}

}sort(a+1 , a+1+n , cmp);

int l = 0;

rep(i , 1 , n)

cout << ans << endl;

}signed main()

括號匹配 棧

蒜頭君在紙上寫了乙個串,只包含 和 乙個 能唯一匹配乙個 但是乙個匹配的 必須出現在 之前。請判斷蒜頭君寫的字串能否括號完全匹配,如果能,輸出配對的括號的位置 匹配的括號不可以交叉,只能巢狀 一行輸入乙個字串只含有 和 輸入的字串長度不大於 50000 如果輸入括號不能匹配,輸出一行 no 否則輸出...

棧括號匹配

input 輸入包括多組測試資料,每組資料是乙個字串,字串只包含 等字元。output 對於每組資料輸出 yes 表示當前字串中的括號是匹配的,否則輸出 no 不包括引號 sampleinput sampleoutput yes no題解 利用棧 includeusing namespace std...

棧 括號匹配

括號匹配,棧的經典題目,將左括號入站,然後遇到右括號就詢問棧頂是不是與之相匹配的左括號,如果是,出棧,不是,匹配失敗。注意這個題目是多組輸入,而且包含空格,所以需要用 gets讀入。include include include include using namespace std typedef...