蒟蒻第一次打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
C
#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)倍即可。