T1标题统计

传送门

题目描述

凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字 符数时,空格和换行符不计算在内。

输入输出格式

输入格式:

输入文件只有一行,一个字符串 $ s $ 。

输出格式:

输出文件只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。

输入输出样例

输入样例#1:

234

输出样例#1:

3

输入样例#2:

Ca 45

输出样例#2:

4

说明

【数据规模与约定】

规定 $ |s| $ 表示字符串 $ s $ 的长度(即字符串中的字符和空格数)。

对于 $ %40 $ 的数据,$ 1 ≤ |s| ≤ 5 $ ,保证输入为数字字符及行末换行符。

对于 $ %80 $ 的数据,$ 1 ≤ |s| ≤ 5 $ ,输入只可能包含大、小写英文字母、数字字符及行末换行符。

对于 $ %100% $ 的数据,$ 1 ≤ |s| ≤ 5 $ ,输入可能包含大、小写英文字母、数字字符、空格和行末换行符。

这个题感觉大水题吧,会用 $ gets $ 输入感觉问题就不大 。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define re register
using namespace std ; char s[10] ;
int ans , len ; int main() {
gets(s) ;
len = strlen(s);
for(re int i = 0 ; i < len ; ++i) {
if(s[i] >= '0' && s[i] <= '9') ans ++ ;
if(s[i] >= 'A' && s[i] <= 'Z') ans ++ ;
if(s[i] >= 'a' && s[i] <= 'z') ans ++ ;
}
printf("%d\n" , ans) ;
return 0 ;
}

T2龙虎斗

传送门啦

题目描述

轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 $ n $ 个兵营(自左至右编号 $ 1 \sim n $ ),相邻编号的兵营之间相隔 $ 1 $ 厘米,即棋盘为长度为 $ n-1 $ 厘米的线段。$ i $ 号兵营里有 $ c[i] $ 位工兵。

下面图 1 为 $ n=6 $ 的示例:

轩轩在左侧,代表“龙”;凯凯在右侧,代表“虎”。 他们以 $ m $ 号兵营作为分界, 靠左的工兵属于龙势力,靠右的工兵属于虎势力,而第 $ m $ 号兵营中的工兵很纠结,他们不属于任何一方。

一个兵营的气势为:该兵营中的工兵数 $ \times $ 该兵营到 $ m $ 号兵营的距离;参与游戏 一方的势力定义为:属于这一方所有兵营的气势之和。

下面图 2 为 $ n = 6,m = 4 $ 的示例,其中红色为龙方,黄色为虎方:

游戏过程中,某一刻天降神兵,共有 $ s_1 $ 位工兵突然出现在了 $ p_1 $ 号兵营。作为轩轩和凯凯的朋友,你知道如果龙虎双方气势差距太悬殊,轩轩和凯凯就不愿意继续玩下去了。为了让游戏继续,你需要选择一个兵营 $ p_2 $ ,并将你手里的 $ s_2 $ 位工兵全部派往 兵营 $ p_2 $ ​ ,使得双方气势差距尽可能小。

注意:你手中的工兵落在哪个兵营,就和该兵营中其他工兵有相同的势力归属(如果落在 $ m $ 号兵营,则不属于任何势力)。

输入输出格式

输入格式:

输入文件的第一行包含一个正整数 $ n $ ,代表兵营的数量。

接下来的一行包含 $ n $ 个正整数,相邻两数之间以一个空格分隔,第 $ i $ 个正整数代 表编号为 $ i $ 的兵营中起始时的工兵数量 $ c[i] $ 。

接下来的一行包含四个正整数,相邻两数间以一个空格分隔,分别代表 $ m,p_1,s_1,s_2 $ 。

输出格式:

输出文件有一行,包含一个正整数,即 $ p_2 $ ,表示你选择的兵营编号。如果存在多个编号同时满足最优,取最小的编号。

输入输出样例

输入样例#1:

6

2 3 2 3 2 3

4 6 5 2

输出样例#1:

2

输入样例#2:

6

1 1 1 1 1 16

5 4 1 1

输出样例#2:

1

说明

【输入输出样例 1 说明】

见问题描述中的图 2。

双方以 $ m=4 $ 号兵营分界,有 $ s_1=5 $ 位工兵突然出现在 $ p_1=6 $ 号兵营。 龙方的气势为:

$ 2 \times (4-1)+3 \times (4-2)+2 \times (4-3) = 142×(4−1)+3×(4−2)+2×(4−3)=14 $

虎方的气势为:

$ 2 \times (5 - 4) + (3 + 5) \times (6 - 4) = 182×(5−4)+(3+5)×(6−4)=18 $

当你将手中的 $ s_2 = 2 $ 位工兵派往 $ p_2 = 2 $ 号兵营时,龙方的气势变为:

$ 14 + 2 \times (4 - 2) = 1814+2×(4−2)=18 $

此时双方气势相等。

【输入输出样例 2 说明】

双方以 $ m = 5 $ 号兵营分界,有 $ s_1 = 1 $ 位工兵突然出现在 $ p_1 = 4 $ 号兵营。

龙方的气势为:

$ 1 \times (5 - 1) + 1 \times (5 - 2) + 1 \times (5 - 3) + (1 + 1) \times (5 - 4) =11 $

虎方的气势为:

$ 16 \times (6 - 5) = 16 $

当你将手中的 $ s_2 = 1 $ 位工兵派往 $ p_2 = 1 $ 号兵营时,龙方的气势变为:

$ 11 + 1 \times (5 - 1) = 15 $

此时可以使双方气势的差距最小。

【数据规模与约定】

$ 1 < m < n,1 ≤ p_1 ≤ n $ 。

对于 $ %20 $ 的数据,$ n = 3,m = 2, c_i = 1, s_1,s_2 ≤ 100 $ 。

另有 $ %20 $ 的数据,$ n ≤ 10, p_1 = m, c_i = 1, s_1,s_2 ≤ 100 $ 。

对于 $ %60 $ 的数据,$ n ≤ 100, c_i = 1, s_1,s_2 ≤ 100 $ 。

对于 $ %80 $ 的数据,$ n ≤ 100, c_i,s_1,s_2 ≤ 100 $ 。

对于 $ %100 $ 的数据, $ n≤10^5

,c_i,s_1,s_2≤10^9 $ 。

分析:

这个题是很纯的模拟题,就是各种符号有点乱,注意不要打错就好了。模拟的时候在每个点上都加上一次试试,不会超时,而且实现更简单,维护一个最小的差。

需要注意的是如果我们加上这些士兵之后比原来的差值还大,那就放 $ m $ 号点上就好了( $ m $ 点加没加无所谓)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <queue>
#define re register
using namespace std ;
const int maxn = 1e5 + 3 ; inline long long read() {
char ch = getchar();
long long f = 1 , x = 0;
while(ch > '9' || ch < '0') { if(ch == '-') f = -1 ; ch = getchar () ;}
while(ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3 ) + ch - '0' ; ch = getchar() ;}
return x * f;
} long long n , c[maxn] , m , p1 , s1 , s2 , p2 ;
long long now1 , now2 ; int main () {
//freopen("lhd.in","r",stdin);
n = read() ;
for(re int i = 1 ; i <= n ; ++ i) {
c[i] = read() ;
}
m = read() ; p1 = read() ; s1 = read() ; s2 = read() ;
c[p1] += s1 ;
for(re int i = 1 ; i <= m - 1 ; ++ i) now1 += (m - i) * c[i] ;
for(re int i = m + 1 ; i <= n ; ++ i) now2 += (i - m) * c[i] ;
//printf("\n%lld\n%lld\n\n" , now1 , now2) ;
long long cha = 1e9 ;
long long f = 0 ;
if(now1 == now2) printf("%lld\n" , m) ;
else if(now1 > now2) {
for(re int i = m + 1 ; i <= n ; ++ i) {
if(now2 + (i - m) * s2 == now1) {
f = i ;
break ;
}
else {
if(cha > abs(now2 + (i - m) * s2 - now1)) {
cha = abs(now2 + (i - m) * s2 - now1) ;
f = i ;
}
}
}
if(now1 - now2 < cha) printf("%lld\n" , m) ;
else printf("%lld\n" , f) ;
}
else {
for(re int i = 1 ; i <= m - 1 ; ++ i) {
if(now1 + (m - i) * s2 == now2) {
f = i ;
break ;
}
else {
if(cha > abs(now1 + (m - i) * s2 - now2)) {
f = i ;
cha = abs(now1 + (m - i) * s2 - now2) ;
}
}
}
if(now2 - now1 < cha) printf("%lld\n" , m) ;
else printf("%lld\n" , f) ;
}
return 0 ;
}

对称二叉树

传送门

题目描述

一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树:

  1. 二叉树;
  2. 将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等。

下图中节点内的数字为权值,节点外的 id 表示节点编号。

现在给出一棵二叉树,希望你找出它的一棵子树,该子树为对称二叉树,且节点数 最多。请输出这棵子树的节点数。

注意:只有树根的树也是对称二叉树。本题中约定,以节点 $ T $ 为子树根的一棵“子 树”指的是:节点 $ T $ 和它的全部后代节点构成的二叉树。

输入输出格式

输入格式:

第一行一个正整数 $ n $ ,表示给定的树的节点的数目,规定节点编号 $ 1 \sim n $ ,其中节点 $ 1 $ 是树根。

第二行 $ n $ 个正整数,用一个空格分隔,第 $ i $ 个正整数 $ v_i $ 代表节点 $ i $ 的权值。

接下来 $ n $ 行,每行两个正整数 $ l_i , r_i $ ,分别表示节点 $ i $ 的左右孩子的编号。如果不存在左 / 右孩子,则以 $ -1 $ 表示。两个数之间用一个空格隔开。

输出格式:

输出文件共一行,包含一个整数,表示给定的树的最大对称二叉子树的节点数。

输入输出样例

输入样例#1:

2

1 3

2 -1

-1 -1

输出样例#1:

1

输入样例#2:

10

2 2 5 5 5 5 4 4 2 3

9 10

-1 -1

-1 -1

-1 -1

-1 -1

-1 2

3 4

5 6

-1 -1

7 8

输出样例#2:

3

【数据规模与约定】

共 $ 25 $ 个测试点。 $ v_i ≤ 1000 $ 。

测试点 $ 1 \sim 3, n ≤ 10 $ ,保证根结点的左子树的所有节点都没有右孩子,根结点的右 子树的所有节点都没有左孩子。

测试点 $ 4 \sim 8 , n ≤ 10 $ 。

测试点 $ 9 \sim 12, n ≤ 10^5 $ ,保证输入是一棵“满二叉树” 。

测试点 $ 13 \sim 16, n ≤ 10^5 $ ,保证输入是一棵“完全二叉树”。

测试点 $ 17 \sim 20, n ≤ 10^5 $ ,保证输入的树的点权均为 1。

测试点 $ 21 \sim 25, n ≤ 10^6 $ 。

本题约定:

层次:节点的层次从根开始定义起,根为第一层,根的孩子为第二层。树中任一节 点的层次等于其父亲节点的层次加 $ 1 $ 。

树的深度:树中节点的最大层次称为树的深度。

满二叉树:设二叉树的深度为 $ h $ ,且二叉树有 $ 2h-1 $ 个节点,这就是满二叉树。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
using namespace std ;
#define re register
const int maxn = 1e6 + 3 ; inline int read () {
int f = 1 , x = 0 ;
char ch = getchar() ;
while(ch > '9' || ch < '0') {if(ch == '-') f = -1 ; ch = getchar () ;}
while(ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + ch - '0' ; ch = getchar () ;}
return x * f ;
} int n , v[maxn] ;
int l[maxn] , r[maxn] ;
int ch[maxn][2] , c[maxn] , ans ;
//c[]记录当前最大的节点数 bool check (int a , int b) {
//判断两个点是否对称
if(a == b) return true ; //同一个点也算对称
//if(!a || !b) return false ;
if(v[a] != v[b]) return false ; //值不相等不算
return (check(ch[a][1] , ch[b][2]) && check(ch[a][2] , ch[b][1]) ) ;
} inline void dfs (int x) {
if(!x) return ;
dfs(ch[x][1]) ;
dfs(ch[x][2]) ;
c[x] = 1 + c[ch[x][1]] + c[ch[x][2]] ;
//该点最大节点数 = 本身 1 + 左儿子的节点数 + 右儿子的节点数 ;
v[x] = v[x] + v[ch[x][1]] + v[ch[x][2]] ;
//为了判断(两个子树中的总值不相等也说明不对称)
if(ans < c[x] && check(ch[x][1] , ch[x][2])) //左右儿子对称
ans = c[x] ;
} int main () {
n = read () ;
for(re int i = 1 ; i <= n ; ++ i) {
v[i] = read () ;
}
v[0] = 1005 ;
for(re int i = 1 ; i <= n ; ++ i) {
l[i] = read () ;
if(l[i] != -1) ch[i][1] = l[i] ;
r[i] = read () ;
if(r[i] != -1) ch[i][2] = r[i] ;
}
dfs(1) ;
printf("%d\n" , ans ) ;
return 0 ;
}

NOIp 2018 普及组的更多相关文章

  1. NOIP 2018 普及组 解题报告

    目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...

  2. 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题

    洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...

  3. NOIp 2018 普及&提高组试题答案

    你们考的咋样呢?在评论区说出自己的分数吧!

  4. NOIP 2018 提高组初赛试题 题目+答案+简要解析

    一.单项选择题(共 10  题,每题 2  分,共计 20  分: 每题有且仅有一个正确选项)       1. 下列四个不同进制的数中,与其它三项数值上不相等的是( ). A. (269) 16 B ...

  5. NOIp 2018 提高组

    T1铺设道路 传送门 题目描述 春春是一名道路工程师,负责铺设一条长度为 $ n $ 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 $ n $ 块首尾相连的区域,一开始,第 ii ...

  6. NOIP 2018 提高组初赛解题报告

    单项选择题: D 进制转换题,送分: D 计算机常识题,Python是解释运行的: B 常识题,1984年小平爷爷曰:“娃娃抓起”: A 数据结构常识题,带进去两个数据就可以选出来: D 历年真题没有 ...

  7. NOIP 2014 普及组 T4 子矩阵

    [题意] 已知:n,m,r,c,a[i][j] (1 ≤ n ≤ 16, 1 ≤ m ≤ 16,1 ≤ a[i][j] ≤1000,1 ≤ r ≤ n, 1 ≤ c ≤ m) 条件:矩阵的分值定义为每 ...

  8. NOIP 2014 普及组 T3 螺旋矩阵

    [题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...

  9. NOIP 2015普及组复赛Day1 T1 == Codevs4510 神奇的幻方

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold  题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成, ...

随机推荐

  1. 解决Ubuntu14.04下sublime无法输入中文

    原帖地址: (简书作者) http://www.jianshu.com/p/bf05fb3a4709 前言 sublime很好用,但是ubuntu14.04 下不能输入中文,这是一个很大的问题.不知道 ...

  2. mybatis之接口方法多参数的三种实现方式

    关键代码举例: DaoMapper.xml <!-- 传入多个参数时,自动转换为map形式 --> <insert id="insertByColumns" us ...

  3. MongoDB-管道与聚合(3)

    分组:$group()    db.集合.aggregate(       {$group: {_id:'$分组字段名', 显示字段:{$统计函数: '$统计字段'}}},     ) -- 统计男生 ...

  4. 【题解】Oulipo

    题目描述 给出两个串S1,S2(只有大写字母),求S1在S2中出现了多少次. 例如:S1=“ABA”,S2=“ABABA”,答案为2. 输入T组数据,对每组数据输出结果. 输入输出格式 输入格式 第一 ...

  5. Swap HDU - 2819 (有关矩阵的二分匹配)

    题意见大佬:https://www.cnblogs.com/gj-Acit/archive/2013/08/17/3265502.html 题目大意很明确,交换图的某些行或者是某些列(可以都换),使得 ...

  6. JAVA类变量(静态变量)

    类变量也称为静态变量,在类中以static关键字声明,但必须在方法.构造方法和语句块之外. -无论一个类创建了多少个对象,类只拥有类变量的一份拷贝. -静态变量除了被声明为常量外很少使用.常量是指声明 ...

  7. bzoj1098 办公楼

    Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决 ...

  8. (转)丢掉鼠标吧,使用最好用的eclipse快捷键

    背景:eclipse作为自己经常使用的一款开发工具,熟练运用,能够达到事半功倍的效果.下面这篇文章总结了一些平时经常要使用的快捷键,十分的方便. 介绍Eclipse快捷键的文章很多,但大多都不详细,且 ...

  9. RabbitMQ入门介绍

    1.关于AMQP协议 AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设 ...

  10. JMS之——ActiveMQ时抛出的错误Could not connect to broker URL-使用线程池解决高并发连接

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/69046395 解决使用activemq时抛出的异常:javax.j ms.JMSE ...