Educational Codeforces Round 98 (Rated for Div. 2) A-D题解

Educational Codeforces Round 98 (Rated for Div. 2) A-D题解

A

如果x和y差值小于等于1就直接输出x+y,否则最少需要走abs(x-y)-1步到达x和y差值小于等于1的位置。

#include<bits/stdc++.h> 
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define PI acos(-1)
const int maxn = 2e5+5;
const ll mod = 1e9+9;
const double eps = 1e-6L;
int a[maxn],sum[maxn];
int main()
{
	int T=1;
	scanf("%d",&T);
	while(T--)
	{
		int x,y;
		scanf("%d %d",&x,&y);
		if(abs(x-y)<=1)
			printf("%d\n",x+y);
		else
		{
			printf("%d\n",x+y+abs(x-y)-1);
		}
	}
	return 0;
}

B

求平均数,得向上取整,平均数是⌈sum/(n-1)⌉,然后和序列中最大值作比较,这就是你最后分配完每个数的值,这种情况下肯定最小,然后求差值,就是答案。

#include<bits/stdc++.h> 
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define PI acos(-1)
const int maxn = 2e5+5;
const ll mod = 1e9+9;
const double eps = 1e-6L;
ll a[maxn];
int main()
{
	int T=1;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		ll sum=0;
		ll maxx=-1;
		for(int i=0;i<n;i++)
		{
			scanf("%lld",&a[i]);
			sum += a[i];
			maxx = max(maxx,a[i]);
		}
		ll avg = sum/(n-1);
		if(sum%(n-1)!=0)	avg++;
		if(avg>=maxx)
		{
			if(sum%(n-1)!=0)
				printf("%lld\n",abs(n-1-sum%(n-1)));
			else
				puts("0");
		}
		else
		{
			if(sum%(n-1)!=0)
				printf("%lld\n",abs(n-1-sum%(n-1))+(maxx-avg)*(n-1));
			else
				printf("%lld\n",(maxx-avg)*(n-1));
		}
	}
	return 0;
}

C

简单的括号匹配

#include<bits/stdc++.h> 
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define PI acos(-1)
const int maxn = 2e5+5;
const ll mod = 1e9+9;
const double eps = 1e-6L;
char s[maxn];
int main()
{
	int T=1;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",s);
		stack<char>s1;
		stack<char>s2;
		int len = strlen(s);
		int ans = 0;
		for(int i=0;i<len;i++)
		{
			if(s[i]=='(')	s1.push('(');
			else if(s[i]=='[')	s2.push('[');
			else if(s[i]==')')
			{
				if(!s1.empty())
				{
					s1.pop();
					ans++;
				}
			}
			else if(s[i]==']')
			{
				if(!s2.empty())
				{
					s2.pop();
					ans++;
				}
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

D

找规律:分子就是斐波那契数列,分母则为 2 的 n 次方

#include<bits/stdc++.h> 
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define PI acos(-1)
const int maxn = 2e5+5;
const ll mod = 998244353;
const double eps = 1e-6L;
ll qpow(ll a,ll n)//快速幂
{
	ll sum = 1;
	while(n)
	{
		if(n & 1)
			sum = sum*a%mod;
		n >>= 1;
		a = a*a%mod;
	}
	return sum % mod;
}
ll f[maxn];
int main()
{
	int T=1;
//	scanf("%d",&T);
	while(T--)
	{
		ll n;
		scanf("%lld",&n);
		ll y = qpow(2,n);
		y = qpow(y,mod-2);
		f[1]=y%mod,f[2]=y%mod,f[3]=(2*y)%mod; 
		for(ll i=4;i<=n;i++)
			f[i] = (f[i-1]+f[i-2])%mod;
//		ll ans = (f[n]*y)%mod;
		printf("%lld\n",f[n]);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值