A. Minimums and Maximums
分析
给出一个数组的最大值最小值的个数范围,求出数组最少有多少个元素。最大最小值可以相同。
因为值可以相同,又要最小,所以如果他们范围是包含关系,直接可以使两个数相同,并输出他们最大的个数,如果不包含,只能分别占用个数,就是两个最小数的和。
代码
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=1e5+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
guanliu;
int t;
cin>>t;
while(t--)
{
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
int ans=max(l1,l2);
if(r1<l2||r2<l1)
{
ans=l1+l2;
}
cout<<ans<<endl;
}
return 0;
}
B. Robots
分析
给一个图,只能对机器人整体进行移动,如果把机器人移除图外就会爆炸,判断是否可以把机器人移到左上角。
因为往左上移,所以需要判断机器人总体的最左和最上的坐标,直接判断这两个点是否会超出图。
代码
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=50;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
char mp[maxn][maxn];
int main()
{
guanliu;
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int f=0;
int x1=0,y1=0,x2=0,y2=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mp[i][j]=='R')
{
x1=i;
y1=j;
f=1;
break;
}
}
if(f) break;
}
f=0;
for(int j=1;j<=m;j++)
{
for(int i=1;i<=n;i++)
{
if(mp[i][j]=='R')
{
x2=i;
y2=j;
f=1;
break;
}
}
if(f) break;
}
if(x1<=x2&&y1<=y2)
{
cout<<"YES"<<endl;
}
else cout<<"NO"<<endl;
}
return 0;
}
C. Binary String
分析
给一个01串,可以从头或从尾删掉一些字符,花费是删掉的1或者剩下的0,求最小的花费。
构造数学公式,分类讨论求解,具体参考大佬题解
也可以采用二分枚举每个位置,算出答案后取最小的答案。
代码
#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=2e5+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int pre[maxn];
int que(int l,int r)
{
return pre[r]-pre[l-1];
}
int main()
{
guanliu;
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
int n=s.size();
s="?"+s;
for(int i=1;i<=n;i++)
{
pre[i]=pre[i-1];
if(s[i]=='0')
{
pre[i]++;
}
}
int sum1=count(s.begin(),s.end(),'1'); //计算一共有多少个1
int ans=sum1;
for(int i=sum1;i<=n;i++)
{
ans=min(ans,que(i-sum1+1,i));
}
cout<<ans<<endl;
}
return 0;
}