Codeforces educational round #87 A~D

A

原题链接

思路: 模拟找规律

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int test=1;
//int n,a[N];		
int a,b,c,d;
int main()
{
	scanf("%d",&test);
	while(test--)
	{

		scanf("%d %d %d %d", &a, &b, &c, &d);

		if(b<a && c<=d)
		{
			cout << -1 << endl;
			continue;
		}
		else if(b>=a)
		{
			cout << b << endl;
			continue;
		}
		long long res = b, tot = b;
		long long cnt = (a-tot)/(c-d);
		res += cnt*c;
		tot+=cnt*(c-d);
		if(tot<a)
		{
			tot+=c-d;
			res+=c;
		}
		
		cout << res << endl;

	}
	return 0;
}

B

原题链接

思路:双指针

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int test=1;
int n,a[N];
string s;
int main()
{
	scanf("%d",&test);
	while(test--)
	{
		vector<pair<int,int> > d,e,f;
		cin >> s;
		int x=0,y=0,z=0;
		for(int i=0;i<s.length();i++)
		{
			if(s[i]=='1')
				x++;
			else if(s[i]=='2')
				y++;
			else
				z++;
		}
		if(x==0 || y==0 || z==0)
		{
			cout << 0 << endl;
			continue;
		}
		int q[200005]={0},p[200005],cnt=1;
		q[1] = 1;
		p[1] = s[0]-'0';
		for(int i=1;i<s.length();i++)
		{
			if(s[i]==s[i-1])
				q[cnt]++;
			else
			{
				q[++cnt]++;
				p[cnt] = s[i]-'0';
			}
		}
		
		int res = 200005;
		for(int i=2;i<cnt;i++)
		{
			if(p[i-1]!=p[i+1])
				res = min(res,q[i]+2);
		}
		cout << res << endl;
	}
	return 0;
}

C1

原题链接

思路:找规律的几何题

在这里插入图片描述
以十二边形为例,找出图中的那个小直角三角形。则可以通过几何关系得出 α = 90/n°, 小直角边的长度是1/2, 则答案为大直角边的两倍,也就是 1/tan(pi/2/n), 注意精度。

代码

#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
const int N = 2e5+10;
int test=1,n;
int main()
{
	scanf("%d",&test);
	while(test--)
	{
		cin >> n;
 		cout << fixed << setprecision(9) << (1.0 / tan(pi/2/n)) << endl;
	}
	return 0;
}

D

题目链接

思路:官方题解是二分

代码

#include<bits/stdc++.h>

using namespace std;

int n, q;
vector<int> a, k;

int count_le(int x)
{
	int cnt = 0;
	for(auto y : a)
		if(y <= x)
			cnt++;
	for(auto y : k)
	{
		if(y > 0 && y <= x)
			cnt++;
		if(y < 0 && abs(y) <= cnt)
			cnt--;
	}
	return cnt;
}

int main()
{
	scanf("%d %d", &n, &q);
	a.resize(n);
	k.resize(q);
	for(int i = 0; i < n; i++)
		scanf("%d", &a[i]);
	for(int i = 0; i < q; i++)
		scanf("%d", &k[i]);
	if(count_le(int(1e9)) == 0)
	{
		puts("0");
		return 0;
	}
	int lf = 0;
	int rg = int(1e6) + 1;
	while(rg - lf > 1)
	{
		int mid = (lf + rg) / 2;
		if(count_le(mid) > 0)
			rg = mid;
		else
			lf = mid;
	}
	printf("%d\n", rg);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值