NOIP2018普及组复赛解析

T1:标题统计


题目大意

输入一个字符串,求字符串除了空格的字符个数


解题思路

这种考你会不会编程的题不会?


code

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int ans;
string c;
int main()
{getline(cin,c);int l=c.size();for(int i=0;i<l;i++)ans+=(c[i]!=' '&&c[i]!='\n');printf("%d",ans);
}

T2:龙虎斗


题目大意

一个长度为n序列,被中间点m分成两半,m左边和m右边。
左边战斗力为
∑i=1m−1(m−i)∗ai\sum_{i=1}^{m-1}(m-i)*a_ii=1m1(mi)ai
∑i=m+1n(i−m)∗ai\sum_{i=m+1}^{n}(i-m)*a_ii=m+1n(im)ai
找到一个数值加s2s2s2,使两边的战斗力之差最小


解题思路

先处理好两边战斗力
暴力枚举位置。注意要用longlong


code

#include<cstdio>
#include<algorithm>
#define N 100010
#define lls long long
using namespace std;
lls n,c[N],m,p1,s1,s2,ans1,ans2,mins,mark;
int main()
{scanf("%lld",&n);for(lls i=1;i<=n;i++)scanf("%lld",&c[i]);scanf("%lld%lld%lld%lld",&m,&p1,&s1,&s2);c[p1]+=s1;for(lls i=1;i<m;i++)ans1+=c[i]*(m-i);for(lls i=m+1;i<=n;i++)ans2+=c[i]*(i-m);mark=0;mins=1e19;for(lls i=1;i<m;i++){if(abs(ans1+s2*(m-i)-ans2)<mins){mark=i;mins=abs(ans1+s2*(m-i)-ans2);}}for(lls i=m+1;i<=n;i++){if(abs(ans1-ans2-s2*(i-m))<mins){mark=i;mins=abs(ans1-ans2-s2*(i-m));}}if((mins==abs(ans1-ans2)&&mark<m)||mins<abs(ans1-ans2)) printf("%lld",mark);else printf("%lld",m);
}

T3:摆渡车


题目大意

n个人,有不同的到达时间。一辆车,来回一次要mminm\ \ minm  min。安排一个来回时间,使所有人等待时间之和最小。


解题思路

我们可以发现m很小可是t却很大。所有我们不一定要从t入手。因为一个人会影响到他的只有之前的m−1minm-1\ \ minm1  min
fi,jf_{i,j}fi,j表示第i个人等了j的等待时间总数。然后我们枚举i和枚举上一班车的最后一个人j。之后枚举那个人等了多久k。我们就可以计算出这个人上车最少等待时间
tj+k+m−tit_j+k+m-t_itj+k+mti
然后我们可以更新fi,wf_{i,w}fi,w
fi,w=min{fi,w,fj,k+sj+1,i+(i−j)∗w}f_{i,w}=min\{f_{i,w},f_{j,k}+s_{j+1,i}+(i-j)*w\}fi,w=min{fi,w,fj,k+sj+1,i+(ij)w}
其中用si,js_{i,j}si,j表示i到j的人都等第j个人上车需要的时间


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 510
#define M 210
using namespace std;
int n,m,t[N],s[N][N],f[N][M],ans;
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&t[i]);sort(t+1,t+1+n);for(int i=1;i<n;i++)//预处理sfor(int j=i+1;j<=n;j++)for(int k=i;k<j;k++)s[i][j]+=t[j]-t[k];memset(f,0x3f3f3f3f,sizeof(f));t[0]=-2e9;for(int i=0;i<=m;i++)//初始化{f[0][i]=0;f[1][i]=i;}for(int i=2;i<=n;i++)//dpfor(int j=0;j<i;j++)for(int k=0;k<=m;k++){int w=t[j]+k+m-t[i];if(w>0)f[i][w]=min(f[i][w],f[j][k]+s[j+1][i]+(i-j)*w);else//特判防越界f[i][0]=min(f[i][0],f[j][k]+s[j+1][i]);}ans=2e9;for(int i=0;i<=m;i++)ans=min(ans,f[n][i]);printf("%d\n",ans);
}

T4:对称二叉树


题目大意

一棵n个点的二叉树,每个点有不同的权值。一棵树对称就是整棵树的左右子节点互换之和长的和之前一样。求这棵树上最大的一颗对称二叉树。


解题思路

对于每个点我们给他两个特征值
z1i=lsoni∗2+rsoni+wi∗4z1_i=lson_i*2+rson_i+w_i*4z1i=lsoni2+rsoni+wi4
z2i=lsoni+rsoni∗2+wi∗4z2_i=lson_i+rson_i*2+w_i*4z2i=lsoni+rsoni2+wi4
lson:这个点有没有左子节点
rson:这个点有没有右子节点
然后先左后右的跑一边,记录跑到的点的z1和这颗子树包含的范围。
再先右后左的跑一边,记录跑到的点的z2和这颗子树包含的范围。
之后对于每个节点用字符串hash判断一下z1对于范围是否和z2对应范围相等,如果相等那么这棵子树就是一颗对称二叉树。

时间负责度:O(n)O(n)O(n)


code

#include<cstdio>
#include<algorithm>
#define N 1000010
#define p 10007
#define ull unsigned long long
using namespace std;
int sz[N],a1[N],b1[N],e1[N],a2[N],b2[N],e2[N],z[N],f[N];
int maxs,n,tot,ls[N],rs[N],w[N];
ull hash1[N],hash2[N],pows[N];
void read(int &x)
{char c;bool flag=false;while(c=getchar())if((c>='0'&&c<='9')||c=='-') break;if(c!='-')x=c-48;else flag=true;while(c=getchar())if(c>='0'&&c<='9') x=x*10+c-48;else break;if(flag) x=-x;
}
void dfs1(int x)
{sz[x]=1;a1[++tot]=z[x];b1[x]=tot;if(ls[x]!=-1)dfs1(ls[x]);if(rs[x]!=-1)dfs1(rs[x]);sz[x]+=sz[ls[x]]+sz[rs[x]];e1[x]=tot;
}
void dfs2(int x)
{if(x==-1) return;a2[++tot]=f[x];b2[x]=tot;if(rs[x]!=-1)dfs2(rs[x]);if(ls[x]!=-1)dfs2(ls[x]);e2[x]=tot;
}
ull hash1z(int l,int r)
{return hash1[r]-hash1[l-1]*pows[r-l+1];}
ull hash2z(int l,int r)
{return hash2[r]-hash2[l-1]*pows[r-l+1];}
bool check(int x)
{if(sz[ls[x]]!=sz[rs[x]]) return false;int l1=b1[x],r1=e1[x],l2=b2[x],r2=e2[x];if(hash1z(l1,r1)==hash2z(l2,r2)) return true;return false;
}
int main()
{read(n);for(int i=1;i<=n;i++)read(w[i]);for(int i=1;i<=n;i++){read(ls[i]);read(rs[i]);//fa[ls[i]]=fa[rs[i]]=i;z[i]=((ls[i]!=-1)<<1)+(rs[i]!=-1)+w[i]*4;f[i]=((rs[i]!=-1)<<1)+(ls[i]!=-1)+w[i]*4;//计算特征值}dfs1(1);//正搜tot=0;dfs2(1);//反搜pows[0]=1;for(int i=1;i<=n;i++){pows[i]=pows[i-1]*p;hash1[i]=hash1[i-1]*p+a1[i];hash2[i]=hash2[i-1]*p+a2[i];}//字符串哈希for(int i=1;i<=n;i++)//枚举节点if(check(i))//判断相等maxs=max(maxs,sz[i]);printf("%d",maxs);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell变量的初始值赋值

转载自 Shell变量的初始值赋值 通常在shell中&#xff0c;在变量值为空的时候我们要为变量设置一个默认值&#xff0c;避免在脚本运行的过程中报错&#xff0c;这就是变量的初始值赋值。 通常比较简洁的有以下两种&#xff0c;都能对一个变量赋予一个初始值&#xff0c; ${va…

【博客】博客转移

最近一直在搞博客&#xff0c;随着博客基本转移到wordpress&#xff0c;总算是告一段落。 我通过各种博客搬家的方式都没能把博客转移到wordpress上&#xff0c;后来实在没办法&#xff0c;强行Gutenberg编辑器&#xff0c;一个一个复制粘贴到自己博客上面&#xff0c;总算是实…

AspectCore中的IoC容器和依赖注入

IOC模式和依赖注入是近年来非常流行的一种模式&#xff0c;相信大家都不陌生了&#xff0c;在Asp.Net Core中提供了依赖注入作为内置的基础设施&#xff0c;如果仍不熟悉依赖注入的读者&#xff0c;可以看看由我们翻译的Asp.Net Core中文文档中依赖注入的相关章节: ASP.NET Cor…

[编程入门]阶乘求和:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。

【题目描述】求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字(n不超过20)。#include<iostream> using namespace std;void fun(int n) {long long sn0,s1;for(int i1;i<n;i){for(int j1;j<i;j){s*j;}sns;s1;}cout<<sn<<endl; }int main() {int n;c…

bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4381 题目大意 有n个岛&#xff0c;n条无向边(保证每个岛都有边连到)。走过的路和岛不可以重走&#xff0c;可以坐船。 坐船要求之前没有任何使用过的船加上道路可以到达那个点才可以坐船。 求最长可…

【总结】找到自适合的学习方法

通过高中与大学的比较 我发现自己大学学的东西要比高中多很多&#xff0c;也要更加的充实。 说白了&#xff0c;其实我认为就是自己擅长与不擅长的学习方式罢了。 1、我更喜欢那种自由轻松一点的学习环境&#xff0c;高中把我压得太紧了&#xff08;老师喜欢提问&#xff09…

HttpClient的性能隐患

最近在进行开发过程中&#xff0c;基于都是接口开发&#xff0c;A站接口访问B接口接口来请求数据&#xff0c;而在这个过程中我们使用的是HttpClient这个框架&#xff0c;当然也是微软自己的框架&#xff0c;性能当前没有问题&#xff0c;但如果你直接使用官方的写法&#xff0…

P5022-旅行【基环树,dfs】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP5022 题目大意 一棵树(可能是基环树)&#xff0c;从1出发&#xff0c;每到达一个新的点就记录下编号。求一种走法使得记录下来的编号字典序最小。 解题思路 我们先不考虑基环树。我们可以发现每次走…

【填坑】博客搬家造成的博客重复问题

原本我的博客数量是差不多八十几篇&#xff0c;昨天晚上一看&#xff0c;怎么变成一百三十多篇了。 惊讶之余有点不可思议&#xff0c;查了才发现原来有几十篇是重复的&#xff0c;后来删掉了一些&#xff0c;但还是有很多 有些也不是重复的&#xff0c;我从知乎发的东西也被搬…

[编程入门]猴子吃桃的问题

猴子吃桃问题。猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。 第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时&#xff0c;见只剩下一个桃子了…

Javafx的WebEgine执行window对象设置属性后为undefined

一、场景复现 window10 jdk1.8u221 package main;import javafx.application.Application; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.Sta…

P4168-[Violet]蒲公英【分块】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4168 题目大意 询问区间众数 解题思路 将数字离散化&#xff0c;然后分块。对于数组vi,j,kv_{i,j,k}vi,j,k​&#xff0c;表示i∼ji\sim ji∼j个块&#xff0c;kkk的个数。对于询问(l,r)(l,r)(l,r)&…

使用acs-engine在Azure中国区部署kubernetes集群详解

1. acs-engine简介 ACS是微软在2015年12月推出的一项基于容器的云端PaaS服务。说简单点&#xff0c;acs-engine就是一个ARM模板生成器&#xff0c;用户只需要配置几个简单的参数来描述容器集群的规格&#xff0c;然后acs-engine将这个容器集群描述文件转化成一组ARM&#xff08…

C++描述杭电OJ 2011.多项式求和 ||

C描述杭电OJ 2011.多项式求和 || Problem Description 多项式的描述如下&#xff1a; 1 - 1/2 1/3 - 1/4 1/5 - 1/6 … 现在请你求出该多项式的前n项的和。 Input 输入数据由2行组成&#xff0c;首先是一个正整数m&#xff08;m<100&#xff09;&#xff0c;表示测试实…

【Java】continue和break区别

先总结下&#xff1a;break先跳出整个大的循环&#xff0c;而continue跳出的是相对小的循环 也就是说他们的区别核心在于循环的大小 就举个例子吧&#xff0c;用for循环从一数到十&#xff0c;到五用上break和continue的区别 用break&#xff1a; public class test_01 { pu…

JS中令人发指的valueOf方法介绍

转载自 JS中令人发指的valueOf方法介绍 彭老湿近期月报里提到了valueOf方法&#xff0c;兴致来了翻了下ECMA5里关于valueOf方法的介绍&#xff0c;如下&#xff1a; 15.2.4.4 Object.prototype.valueOf ( ) When the valueOf method is called, the following steps are take…

P3203-[HNOI2010]弹飞绵羊【分块】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3203 题目大意 nnn个装置。到第iii个装置会被往前弹aia_iai​个。 两种操作 修改aia_iai​和询问从iii出发要多少次弹射可以弹出去。 解题思路 分块。对于每个点&#xff0c;维护要多少步弹出该块和弹…

Lyft的TypeScript实践

来自Lyft的前端工程师Mohsen Azimi介绍了Lyft向TypeScript转型的过程&#xff0c;说明JavaScript类型系统的重要性、为什么Lyft选择TypeScript以及他们的一些实践经验。以下内容翻译自作者的博客&#xff0c;查看原文TypeScript at Lyft。 在我刚刚成为JavaScript开发者的时候&…

【Python】Conda的安装

挖个坑&#xff0c;以后自己慢慢填&#xff1a;下载conda后无法使用 conda优势&#xff1a;conda将几乎所有的工具、第三方包都当做package对待&#xff0c;甚至包括python和conda自身&#xff01;因此&#xff0c;conda打破了包管理与环境管理的约束&#xff0c;能非常方便地…

C++描述杭电OJ 2014. 青年歌手大奖赛_评委会打分 ||

C描述杭电OJ 2014. 青年歌手大奖赛_评委会打分 || Problem Description 青年歌手大奖赛中&#xff0c;评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分&#xff0c;然后计算平均得分&#xff0c;请编程输出某选手的得分。 Input 输入数据有多组&#xff0c…