Codeforces Round 859 (Div. 4)

蒟蒻第一次打CF,最简单的Div4只A了4道简单题,后面一个小时都死磕在F题上。一开始用了GCC编译器,第一题都编译报错,呜呜呜。后来才发现应该用G++。

A

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	for (int i=0;i<n;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		if (a+b==c) cout<<"+"<<endl;
		else cout<<"-"<<endl;
	}



  return 0;
}

评价:签到题

 B

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	cin>>n; 
	for (int i=0;i<n;i++)
	{
		int m;
		int mihai=0,bianca=0;
		cin>>m;
		int candy[m];
		for (int j=0;j<m;j++)
		{
			cin>>candy[j];
		}
		for (int j=0;j<m;j++) 
			if (candy[j]%2==0) mihai+=candy[j];
			else bianca+=candy[j];
		if (mihai>bianca) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	} 
  return 0;
}

评价:将偶数全部放在前面,即先取完全部的偶数。

若偶数和大于奇数和即为Yes,否则为No

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	for (int i=0;i<n;i++)
	{
		int len;
		string s;
		cin>>len;
		cin>>s;
		char c;
		int flag=0;
		for (int i=0;i<len;i++)
		{
			for (int j=i+1;j<len;j+=2)
			{
				if (s[j]==s[i]) 
				{
					flag=1;
					break;
				}
				if (flag==1) break;
			}
		}
		if (flag==1) cout<<"No"<<endl;
			else cout<<"Yes"<<endl;
	}


  return 0;
}

思路:由于每个字母都可以被任意赋值,那么只要保证相同的字母在不相邻的位置即可。我的做做法可能比较繁琐,应该还有更加简单的做法。 我的做法是对于每一个字母,从它的后一位开始,以2为步长去遍历全数组,若出现与它相同的字母,则不满足“相同的字母在不相邻的位置”,故是有不行的,若整个数组遍历之后都未出现该种情况,则是满足的。

D

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	for (int i=0;i<t;i++)
	{
		int n,q;
		cin>>n>>q;
		int map[n+1];
		map[0]=0;
		for (int j=1;j<=n;j++)
		{
			int temp;
			cin>>temp;
			map[j]=map[j-1]+temp;
		}
		for (int j=0;j<q;j++)
		{
			int l,r,k;
			cin>>l>>r>>k;
			int total=(map[l-1]-map[0])+(map[n]-map[r])+k*(r-l+1);
			if (total%2==0) cout<<"No"<<endl;
			else cout<<"Yes"<<endl;
		}
	} 



  return 0;
}

思路:需要大量地查询某段区间的和,而且要多次查询,显然用每次遍历的方法肯定超时,根据这个性质我们可以使用前缀和。

前缀和的性质为:对于原数组a[],前缀和数组 m[],有m[i]=a[i]+m[i-1],

这样a[i]+……+a[j]=m[j]-m[i-1],可以实现O(1)时间内查询到这个加和的结果

具体地,对本题而言,查询0到l和r到n的和,然后加上中间替换数的(r-l+1)倍即可。

E

F

G1

G2

猜你喜欢

转载自blog.csdn.net/qq_39480177/article/details/129661790