【CF Educational Codeforces Round 128 Div. 2】A-C

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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值