AtCoder Beginner Contest 267 ABC题解

悲催的是,卡死在了第三题。

A - Saturday

第一题,问输入的星期到Saturday多长时间,直接码了。

代码:

#include
using namespace std;
int main()
{
	string ss;
	cin >> ss;
	if(ss == "Monday")
	cout << 5;
	if(ss == "Tuesday")
	cout << 4;
	if(ss == "Wednesday")
	cout << 3;
	if(ss == "Thursday")
	cout << 2;
	if(ss == "Friday")
	cout << 1;
	return 0; 
} 

B - Split?

第二题,题意略复杂,但理解了意思,就很好做了。

说这10个保龄球,是分割的状态还是连接的。其中分开的意思是一列的点全倒了,把一个点孤立了,或者把两部分分开了,就叫做分开。

这道题思路可以直接特判。

代码:

#include
using namespace std;
int main()
{
	string s;
	cin >> s;
	bool a[20];
	memset(a,sizeof(a),false); 
	for(int i=0;i<10;i++)
	if(s[i]=='1') a[i+1] = true;
	else a[i+1] = false;
	if(a[1] == 1) cout << "No\n";
	else
	{
		int sum = 0;
		for(int i=1;i<=10;i++)
		sum += a[i];
		if(sum == 0)
		{
			cout << "No\n";
			return 0;
		}
		if(a[3]+a[9]==0)
		{
			cout << "Yes\n";
			return 0;
		}
		if(a[2]+a[8]==0)
		{
			cout << "Yes\n";
			return 0;
		}
		if(a[5]==0)
		{
			cout << "Yes\n";
			return 0;
		}
		if(a[7]==1&&a[4]==0)
		{
			cout << "Yes\n";
			return 0;
		}
		if(a[10]==1&&a[6]==0)
		{
			cout << "Yes\n";
			return 0;
		}
		cout << "No\n";
	}
	return 0; 
} 

C - Index × A(Continuous ver.)

第三题,最后想出来了思路,一定要清晰码题。

n个数,取连续的m个,求最大的i*a[m]的值,i是m中的第i个位置。

这个题暴力是要TLE的,只能使用一些数学方法,一遍边跑边处理,实现O(n)的时间复杂度。

代码:

#include
using namespace std;
typedef long long ll;
ll a[200010],b[200010],c[200010]; 
int main()
{
	int n, m;
	cin >> n >> m;
	ll ans = -1e18;
	for(int i=1;i<=n;i++){
		cin >> a[i];
		c[i] = c[i-1]+a[i];
		a[i] = a[i]*i;
		b[i] = b[i-1]+a[i];
		if(i>=m) 
		ans = max(ans, b[i]-b[i-m]-(c[i]-c[i-m])*(i-m));
	}
	cout << ans;
	return 0;
}

你可能感兴趣的:(AtCoder,c++,算法,图论)