A. 让两个矩形的两条边重合 注意ll
#include <bits/stdc++.h>
using namespace std;
int main(){
long long a,b,c,d;cin>>a>>b>>c>>d;
cout<<min(a,c)*min(b,d);
}
B.因为每次只能从1开始走 所以首和尾只要是1 就可以一次结束 除了全是1 是0 其他都是2
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
bool ok=0;
string s;cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='0')ok=1;
}
if(ok){
if(s[0]=='1'||s[n-1]=='1'){
cout<<1<<endl;
}
else {
cout<<2<<endl;
}
}
else {
cout<<0<<endl;
}
}
C.分类讨论即可 a==b a->b a->1||->n ->b
#include <bits/stdc++.h>
using namespace std;
void solve(){
long long n,k,a,b;cin>>n>>k>>a>>b;
if(a==b){
cout<<"YES\n";
return ;
}
if(abs(a-b)>k)cout<<"YES\n";
else if(n<=k)cout<<"NO\n";
else if((abs(a-1)>k||abs(a-n)>k)&&(abs(b-1)>k||abs(b-n)>k))cout<<"YES\n";
else cout<<"NO\n";
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
D. 只要两个数是g的倍数 每次都max g
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int mp[N];
int main(){
int n;cin>>n;
int maxx=0;
for(int i=1;i<=n;i++){
int x;cin>>x;
mp[x]++;
maxx=max(maxx,x);
}
int ans=1;
for(int i=2;i<=maxx;i++){
int cnt=0;
for(int j=i;j<=maxx;j+=i){
if(mp[j]){
cnt+=mp[j];
if(cnt>=2){
ans=max(ans,i);
}
}
}
}
cout<<ans<<endl;
}
E . 无脑dfs即可
#include<bits/stdc++.h>
using namespace std;
string n;
int ans=0;
void dfs(string s,int num,int flag){
if((s.size()>n.size())||(s.size()==n.size()&&s>n))
return ;
if(num>=3)
flag=1;
if(flag)
ans++;
dfs(s+'0',0,flag);
dfs(s+'1',num+1,flag);
}
int main()
{
cin>>n;
dfs("1",1,0);
cout<<ans<<endl;
}