A. 最大面积
题目要求 求两矩阵最大相交面积
答案很明显为min(a,c)*min(b,d)
但要注意两个相乘<=1e12因此要开long long
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
#define ll long long
#define ull unsigned long long
const int mod = 1e9 + 7;
typedef pair<int, int> PII;
const int N = 1e3 + 7;
void solve() {
int a,b,c,d;
cin>>a>>b>>c>>d;
int a1=min(a,c);
int b1=min(b,d);
int ans=a1*b1;
cout<<ans<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
// system("pause>nul");
}
B.种树
这题讨论4种情况
第一种首和尾都是零 此时无论如何最小次数都需要跑两遍 即ans=2;
第二种首为零但尾不为零 可以选择 i=n,j=1;此时只需要跑一遍,即ans=1;
第三种首不为零尾为零,同理可得ans=1;
第四种所有全部都不为零此时ans=0;
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
#define ll long long
#define ull unsigned long long
const int mod = 1e9 + 7;
typedef pair<int, int> PII;
const int N = 1e3 + 7;
void solve() {
int n;
cin>>n;
string s;
cin>>s; int idx=-1,idj=n; int flag=0; int flag1=0; int num=0;
for(int i=0;i<n;i++){
if(s[i]!='0'){
num++;
}
}
if(num==n){
cout<<0<<endl;
return;
}
if(s[0]=='0') flag=1;
if(s[n-1]=='0') flag1=1;
if(flag1&&flag){
cout<<2<<endl;
}
else{
cout<<1<<endl;
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
// system("pause>nul");
}
C.奇怪的电梯
这题思路从 a 到 b 有四种情况
第一种,a=b,不用坐电梯,;
第二种,按一次按钮后 a 可以直接去 b;
第三种,a不能去b但是可以到达n,n能到达b;
第四种,a不能去b可以达到n,n不能到达b,可以到达1,1可以到达b;(同理a-1-n-b也可以)
其他情况全部是no
由于赛时情况考虑不全,wa了很多发,代码写的很乱,将就着看吧
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
#define ll long long
#define ull unsigned long long
const int mod = 1e9 + 7;
typedef pair<int, int> PII;
const int N = 1e3 + 7;
void solve() {
ll n,k,a,b;
cin>>n>>k>>a>>b;
if(a==b){
cout<<"YES"<<endl;
return;
}
if(k==0){
cout<<"YES"<<endl;
return;
}
if((b>(a+k))||(b<(a-k))){
cout<<"YES"<<endl;
return;
}
if(a+k<n){
ll t=n-k;
if(t>b){
cout<<"YES"<<endl;
return;
}
else{
t=1+k;
if(b>t){
cout<<"YES"<<endl;
return;
}
}
}
if(a-k>1){
ll t=k+1;
if(t<b){
cout<<"YES"<<endl;
return;
}
else{
t=n-k;
if(t>b){
cout<<"YES"<<endl;
return;
}
}
}
cout<<"NO"<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
cin >> t;
while (t--) {
solve();
}
// system("pause>nul");
}
D.最大gcd
首先当一个数和他的倍数出现了两次及以上那么两个数的最大公约数就是他本身例如gcd(2,6)=2;
gcd(3,9)=3;
所以我们可以找到数组的最大值然后从二开始枚举答案(因为答案最小为1)
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
#define ll long long
#define ull unsigned long long
const int mod = 1e9 + 7;
typedef pair<int, int> PII;
const int N = 1e6 + 7;
int b[N]; int v[N];
void solve() {
int n;
cin>>n; map<int,int> mp; int maxx=0;
for(int i=0;i<n;i++){
cin>>b[i];
v[b[i]]++;
maxx=max(maxx,b[i]);
}
int ans=1;
for(int i=2;i<=maxx;i++){
int num=0;
for(int j=1;j<=maxx/i;j++){
num+=v[i*j];
}
if(num>=2) ans=max(ans,i);
}
cout<<ans<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
}
E.一道难题
应为1-n的数只有0和1组成 所以枚举情况只有2^23种小于1e7
所以这题可以直接dfs暴搜注意判断搜出来的要小于n
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
#define ll long long
#define ull unsigned long long
const int mod = 1e9 + 7;
typedef pair<int, int> PII;
const int N = 1e5 + 7;
string n;
string s;
int len; int ans;
bool check(){
for(int i=0;i<s.size();i++){
if(s[i]-'0'<n[i]-'0') return true;
if(s[i]-'0'>n[i]-'0') return false;
}
return true;
}
void dfs(int now){
if(now==len){
if(!check()) return;
int num=0;
int flag=0;
for(int i=0;i<len;i++){
if(s[i]=='1') num++;
else num=0;
if(num>=3) flag=1;
}
if(flag)
ans+=1;
return;
}
s+='1';
dfs(now+1);
s.erase(s.end()-1);
s+='0';
dfs(now+1);
s.erase(s.end()-1);
}
void solve()
{
cin>>n;
len=n.size();
dfs(0);
cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 1;
// cin>>t;
while (t--)
{
solve();
}
}