输入一组数据表示边的长度,找四条边构成矩形,求这个矩形的最大面积
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 typedef long long ll; 5 int n,a[100005]; 6 int main() 7 { 8 cin>>n; 9 for(int i=0;i<n;i++) 10 cin>>a[i]; 11 sort(a,a+n); 12 ll ans=1; 13 int cnt,flag=0,j,fflag=0; 14 for(int i=n-1;i>=0;i--) 15 { 16 cnt=1; 17 for(j=i-1;j>=0;j--) 18 { 19 if(a[i]==a[j]) 20 { 21 cnt++; 22 } 23 else 24 { 25 i=j+1; 26 break; 27 } 28 } 29 if(cnt==2||cnt==3) 30 { 31 if(flag==2) 32 { 33 cout<<ans<<endl; 34 fflag=1; 35 break; 36 } 37 else if(flag==1){ 38 ans*=(ll)a[i]; 39 cout<<ans<<endl; 40 fflag=1; 41 break; 42 } 43 else 44 { 45 ans*=(ll)a[i]; 46 flag++; 47 } 48 } 49 else if(cnt>=4) 50 { 51 if(flag==0) 52 { 53 cout<<(ll)a[i]*a[i]<<endl; 54 fflag=1; 55 break; 56 } 57 else if(flag==1) 58 { 59 ans*=(ll)a[i]; 60 cout<<ans<<endl; 61 fflag=1; 62 break; 63 } 64 } 65 } 66 if(!fflag) 67 cout<<"0"<<endl; 68 // cout << "Hello world!" << endl; 69 return 0; 70 }
染色问题
题目已经限制只有两行,因此我们可以遍历一遍,每次都和前面的矩形进行比较。建立一个a[i]数组用来表示当前矩形的状态(a[i]==1表示矩形是竖着的,a[i]==2表示矩形是横着的)
由于只有三种颜色,经过分析,我们可以得出矩形的排列有四种状态。每个对应的状态乘以它的方法数就行了。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const int mod=1000000007; 5 typedef long long ll; 6 int n,a[100]; 7 string s1,s2; 8 int main() 9 { 10 cin>>n; 11 cin>>s1>>s2; 12 ll ans=1,h; 13 for(int i=0;i<n-1;i++) 14 { 15 if(s1[i]==s1[i+1]){ 16 a[i]=2; 17 a[i+1]=2; 18 i++; 19 } 20 else 21 a[i]=1; 22 } 23 if(a[n-1]==a[n-2]) 24 a[n-1]=2; 25 else 26 a[n-1]=1; 27 if(s1[0]==s1[1]) 28 { 29 ans*=6; 30 h=2; 31 } 32 else 33 { 34 ans*=3; 35 h=1; 36 } 37 for(ll i=h;i<n-1;i++) 38 { 39 if(s1[i]==s1[i+1]&&a[i-1]==2) 40 { 41 ans=(ans%mod*3)%mod; 42 i++; 43 } 44 else if(s1[i]==s1[i+1]&&a[i-1]==1) 45 { 46 ans=(ans%mod*2)%mod; 47 i++; 48 } 49 else if(s1[i]!=s1[i+1]&&a[i-1]==1) 50 { 51 ans=(ans%mod*2); 52 } 53 } 54 55 if(s1[n-1]!=s1[n-2]&&a[n-2]==1) 56 { 57 ans=(ans%mod*2); 58 } 59 ans%=mod; 60 cout<<ans<<endl; 61 // cout << "Hello world!" << endl; 62 return 0; 63 }