先来解释一下为毛现在才来发解题报告:
其实博主是参加过NOIP 2018普及组的复赛的,不过当时成绩垃圾的一批。只混到一个三等奖......
今天老师又给考了一遍noip2018普及的题,结果第三题还是不太会,卧槽.....这.....不过我竟然用暴力dfs+剪枝过了(只是在网上luogu过了,本地TLE下面会说到的,咕咕咕)
下面是正式的解题报告:
标题统计
题目链接
思路
没什么好说的,不会请右上角
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<string>
#include<cstring>
using namespace std;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
char s;
int ans;
int main()
{
while(cin>>s)
{
if(s!='
'&&s!=' ')
{
ans++;
}
}
cout<<ans;
return 0;
}
龙虎斗
题目链接:
思路
就是直接模拟,枚举你支援的兵放到的兵营,然后找到气势差最小的就行了,注意开long long可恶的CCF竟然卡我们long long
一定要开long long !
一定要开long long !
一定要开long long !
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
long long int l=0,h=0,m,p1,s1,s2,n,chushi[100000],ans,p2,pam,ltag,htag,tag;
long long int chazhi=0;
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;++i)
{
cin>>chushi[i];
}
cin>>m>>p1>>s1>>s2;
if(p1!=m)
chushi[p1]=chushi[p1]+s1;
for(int i=1;i<m;++i)
{
l=l+chushi[i]*(m-i);
}
for(int i=m+1;i<=n;++i)
{
h=h+chushi[i]*(i-m);
}
chazhi=abs(l-h);
tag=chazhi;
ltag=l;
htag=h;
pam=-9876;
ans=chazhi;
for(int i=1;i<=n;++i)
{
if(i<m)
{
l=l+s2*(m-i);
chazhi=abs(l-h);
if(chazhi<ans)
{
p2=i;
ans=chazhi;
tag=chazhi;
pam=ans;
l=ltag;
}
else
{
chazhi=tag;
l=ltag;
}
}
if(i>m)
{
h=h+s2*(i-m);
chazhi=abs(l-h);
if(ans>chazhi)
{
p2=i;
ans=chazhi;
tag=chazhi;
h=htag;
pam=ans;
}
else
{
chazhi=tag;
h=htag;
}
}
}
if(pam==-9876)
cout<<m;
else
cout<<p2;
return 0;
}
摆渡车
题目链接:
思路
4个题里最难的一个了,不过时限也给了良心的2s(注意这里)
对称二叉树
题目链接
思路:
乍一看很难,其实仔细一想并不难
所谓对称二叉树就是把树从根节点划一条线两边对折后完全相同(注意无论结构还是数值都相同)
我们可以用递归的方式来遍历左右子树
那么就可以来搞一下不对称的情况了
第一种是结构不对称:
就是只出现了一个-1没有同时递归到-1
第二种是数值上不对称:
只需判断左子树的左孩纸和右子树的右孩子已经左孩纸和右子树的左孩子和左子树的右孩子是不是数值相同就行了
最后统计节点数维护一个max就行了