AtCoder Beginner Contest 174(A——E)

A.Air Conditioner

签到题

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    
    
	int x;
	cin >> x;
	if (x >= 30)
		cout << "Yes" << endl;
	else
		cout << "No" << endl;
}

B.Distance

注意开大一点的值 即可

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    
    
	long long int n, d;
	double x, y;
	long int num = 0;
	cin >> n >> d;
	for (long int i = 1; i <= n; i++)
	{
    
    
		cin >> x >> y;
		if (x * x + y * y <= d * d)
			num++;
	}
	cout << num << endl;
}

C.Repsept

给你一个 k 从他的倍数中找到一个只含 7 的输出这个倍数的长度。

我们可以维护一个值,即当前这么多7组成的数模n的值。在末尾加上一个7后,变为了10x+7,那么模数也乘10加7。

#include<iostream>
#include<algorithm>
using namespace std;
int main() 
{
    
    
	long long int k; 
	cin >> k;
	int ans = 1;
	for (int mod = 7; mod % k; mod = (mod * 10 + 7) % k)
	{
    
    
		if (++ans > k)
		{
    
    
			ans = -1;
			break;
		}
	}
	cout << ans << endl;
}

D. Alter Altar

n 个石子排成一行,石子分两种,一种为R一种为W,可以进行两种操作:交换任意两个石子、改变一个的类型。问最少几次操作后不存在R石子紧邻的左边为W的情况

最后情况,左边全是R,右边全是W。

于是我们可以算出W的数量为ans,然后得出最后ans位不为W的字符数量,然后每个和前面交换,达到最优情况

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main() 
{
    
    
	char s[200005];
	long int n;
	cin >> n;
	long int ans = 0;
	for (int i = 0; i <n; i++)
	{
    
    
	    cin >> s[i];
		if (s[i] == 'W')
			ans++;
	}
	long long cnt = 0;
	for (int i = n - ans; i < n; i++)
	{
    
    
		if (s[i] != 'W')
			cnt++;
	}
	cout << cnt << endl;
}

E.Logs

有 n 个木头,每个木头有一个自己的长度,你可以切 k 次,使得切出来的木头中最长的最短,问最短为多长(小数就四舍五入)。

我们可以这么想,分别考虑每个块至少要被劈的次数使得其产生的新块中不含大于mid的块,能否让块的最大值最终不大于mid且劈的次数不多于k次。次数过多则增加mid的值,过少则减少mid的距离,不断更新mid的值使其最大。(用二分法多次逼近)

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
long int n;
long int a[200005];
long int k;
inline int log_number(int log, int mid)
{
    
    
	if (log % mid == 0)
		return log / mid;
	else
		return log / mid+1;
}
bool check(int len)
{
    
    
	int ans = 0;
	for (int i = 1; i <= n; i++)
	{
    
    
		ans += log_number(a[i], len)-1;
	}
	if (ans <= k)
		return true;
	else
		return false;
}
int main() 
{
    
    
	cin >> n >> k;
	for (int i = 1; i <=n; i++) 
	{
    
    
		cin >> a[i];
	}
	int l = 1, r = 1e9;
	while (r - l > 1) 
	{
    
    
		int mid = (l + r) / 2;
		if (check(mid)) 
			r = mid;
		else l = mid;
	}
	cout << (check(l) ? l : r) << endl;
}

F.Range Set Query

一个长为 n 的序列,每次询问一个区间 [L,R] 中有不同的数有几种

树状数组,洛谷原题,题目

猜你喜欢

转载自blog.csdn.net/weixin_45605341/article/details/107758666