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<<' '; 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<<' '; 53 return 0; 54 }