Hello 2019【A,B,C】

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 signed main(){
 5     string str;
 6     cin>>str;
 7     int flag=0;
 8     for(int l=0;l<5;l++){
 9         string t;
10         cin>>t;
11         for(int i=0;i<t.size();i++){
12             for(int j=0;j<str.size();j++){
13                 if(str[j]==t[i]){
14                     flag=1;
15                 }
16             }
17         }
18     }
19     if(flag){
20         cout<<"YES";
21     }else{
22         cout<<"NO";
23     }
24     return 0;
25 }

 直接暴力就过了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 int arr[30];
 5 int ans[30];
 6 signed main(){
 7     int n;cin>>n;
 8     for(int i=1;i<=n;i++){
 9         cin>>ans[i];
10         arr[i]=1;
11     } 
12     int flag=0;
13     for(int i=0;i<=n;i++){
14         for(int j=0;j<=25;j++) arr[i]=1;
15         for(int j=0;j<i;j++) arr[j]=-1;
16         do{
17             int sum=0;
18             for(int k=1;k<=n;k++){
19                 sum+=ans[k]*arr[k];
20             }
21             if(sum%360==0||sum==0){
22             //    for(int k=1;k<=n;k++) cout<<arr[k]<<" ";
23             //    cout<<'\n';
24                 flag=1;
25                 break;
26             }
27         }while(next_permutation(arr+1,arr+n+1));
28         if(flag){
29             break;
30         }
31     }
32     if(flag) cout<<"YES";
33     else cout<<"NO";
34     return 0;
35 }

题意:有n个只含有'('和')'的字符串,现在要字符串两两拼接,如果一个拼接后的字符串中的括号都配对了就称为完美匹配,问最多有几个完美匹配。(())就算一个完美匹配,))((或者())就不算。

直接将每对中合法的先抛掉,然后取最值。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 int vis1[500900];
 5 int vis2[500900];
 6 signed main(){
 7     int n;cin>>n;int add=0;
 8     for(int i=1;i<=n;i++){
 9         string str;
10         cin>>str;
11         stack<char> s;
12         for(int j=0;j<str.size();j++){
13             if(s.empty()){
14                 s.push(str[j]);
15             }else{
16                 char temp=s.top();
17                 if(temp=='('&&str[j]==')'){
18                     s.pop();
19                 }else{
20                     s.push(str[j]);
21                 }
22             }
23         }
24             if(s.empty()){
25                 add++;
26             }else{
27                 int flag1=0;
28                 int flag2=0;
29                 int num=s.size();
30                 while(!s.empty()){
31                     char t=s.top();s.pop();
32                     if(t=='('){
33                         flag1=1;
34                     }else{
35                         flag2=1;
36                     }
37                 } 
38                 if(flag1&&flag2){
39                     continue;
40                 }else if(flag1&&!flag2){
41                     vis1[num]++;
42                 }else if(!flag1&&flag2){
43                     vis2[num]++;
44                 }
45             }              
46         
47     }            
48     int ans=add/2;
49     for(int i=1;i<=500000;i++){
50         ans+=min(vis1[i],vis2[i]);
51     }
52     cout<<ans<<'\n';            
53     return 0;
54 }

猜你喜欢

转载自www.cnblogs.com/pengge666/p/12070361.html