Codeforces Round 964 (Div4) A-E题解

A:A+B Again?

题解:根据题意直接写就好了

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int t;
		cin>>t;
		int ans=0;
		while(t)
		{
			ans+=(t%10);
			t=t/10;
		}
		cout<<ans<<endl;
	}
	return 0;
}

B:Card Game

 

题意:有两个人 a和b 每人有两张卡牌 每次都翻一张卡牌 谁的卡牌大谁获胜一小局 1:0或者2:0获胜 因此有6种情况 最后答案乘以2 因为每一大局中两小局可以交换位置

#include<iostream>
using namespace std;
int a,b,c,d;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int ans=0;
		cin>>a>>b>>c>>d;
		if(a>c&&b>d)
		ans++;
		else if(a>c&&b==d)
		ans++;
		else if(a==c&&b>d)
		ans++;
		if(a>d&&b>c)
		ans++;
		else if(a>d&&b==c)
		ans++;
		else if(a==d&&b>c)
		ans++;
		cout<<ans*2<<endl;
	}
	return 0;
}

C:Showering

题意:说一天有m分钟 而亚历克斯有n个任务 给出每个任务的起始时间和结束时间且没有任务会时间重叠。问有没有连续s分钟时间足够亚历克斯洗澡。我们从头遍历就好了 把每次任务的起始时间当作洗澡结束时间 看看有没有s分钟就好了

#include<iostream>
#include<cstdio>
using namespace std;
const int N=200010;
int l[N],r[N];
int n,s,m,t;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&n,&s,&m);
		for(int i=0;i<n;i++)
		scanf("%d%d",&l[i],&r[i]);
		int start=0;
		int end=0;
		bool flag=false;
		for(int i=0;i<n;i++)
		{
			if(i==0)
			{
				end=l[i];
				if(end-start>=s)
				{
					cout<<"YES"<<endl;
					flag=true;
					break;
				}
			}
			else if(i!=0)
			{
				start=r[i-1];
				end=l[i];
				if(end-start>=s)
				{
					cout<<"YES"<<endl;
					flag=true;
					break;
				}
			}
		}
		if(!flag)
		{
			if(m-r[n-1]>=s)
			{
				cout<<"YES"<<endl;
			}
			else
			cout<<"NO"<<endl;
		}
	}
	return 0;
}

D:Slavic's Exam

 题意:给定两个字符串a和b 问b是不是a的子序列  值得注意的是a串中的?可以是任何字母 因此我们可以双指针 做法

#include<iostream>
#include<cstring>
using namespace std;
int t;
int main()
{
	cin>>t;
	while(t--)
	{
		string grn,mc;
		cin>>grn>>mc;
		int temp=mc.size();
		int j=0;
		bool flag=true;
		for(int i=0;i<grn.size();i++)
		{
			if(grn[i]=='?')
			{
				grn[i]=mc[j];
				j++;
			}
			else if(grn[i]==mc[j])
			{
				j++;
			}
			if(j==temp)
			{
				cout<<"YES"<<endl;
				flag=false;
				for(int k=i;k<grn.size();k++)
				{
					if(grn[k]=='?')
					grn[k]='r';
				}
				cout<<grn<<endl;
				break;
			}
		}
		if(flag)
		{
			cout<<"NO"<<endl;
		}
	}
	return 0;
}

E:E. Triple Operations

 

题解:这里好像并不是四舍五入向下取整而是直接向下取整 最好要把所有数字都变成0 显然是只有y/3这个操作可以 所以我们要把最小的一个数先变成0 这样后续每次进行3x操作时就选0这个数字不会使其他数字变大。为了不tle 可以先提前预处理一下 然后再前缀和。这里我的代码没有写前缀和

#include<iostream>
#include<cmath>
using namespace std;
const int N=200010;
int mc[N];
int t;
int l,r;
void grn(int x)
{
	for(int i=1;i<=N;i++)
	{
		if(i==pow(3,x))
		{
			x++;
			mc[i]=x;
		}
		else
		{
			mc[i]=x;
		}
	}
	return ;
}
int main()
{
	cin>>t;
	grn(1);
	while(t--)
	{
		cin>>l>>r;
		long long ans=0;
		for(int i=l;i<=r;i++)
		{
			ans+=mc[i];
		}
		ans+=mc[l];
		cout<<ans<<endl;
	}
	return 0;
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值