2017.08.25【NOIP提高组】模拟赛B组

第一题

题意:给你一个字符串,问你它的子串中有多少个回文串,串的长度小于等于100。
题解:好像没什么可以说的,直接brute force就好了,时间复杂度 O(n3)

第二题

题意:给你一个数n代表一个n边形,再给你一个m代表你有m种颜料,现在你要给这n条边进行染色,使得任意相邻两条边的颜色都不一样,问有多少种方案,由于方案数可能很多,答案对 109+7 取模。
题解:设我们有i条边的时候,答案为 Fi ,我们考虑每加一条边之后的答案,进行分类讨论,当加入第i条边的时候,有两种情况
①新加入的边的相邻两条边的颜色互不相同,那么这时我们新加入入的这条边就有m-2种选择,然后再乘上之前的答案 Fi1 ,所以此时答案为 (m2)×Fi1
②新加入的边的相邻两条边的颜色相同,那么此时我们新加入的边有m-1种选择,另外在这种情况下这两条边中的一条此时对答案是没有贡献的,因为它总是跟另一条边的颜色相同,没有贡献,所以当我们还没加入这条边时,相当于只有i-2边,所以此时答案为 Fi2×(m1)
③综上 Fi=(m2)×Fi1+Fi2×(m1) ,但是如果直接这样算,时间复杂度是 O(n) ,原题的n小于等于 1018
然后我们用一种非常神奇的办法,求出f的特征根,套上快速幂。即可,f的特征根为 Fi=(m1)i+(m1)×(1)i

第三题

题意:在数轴上有n个点,开始在0,每一个点都有一个权值,0这个位置没有,从点i跳到点j能够产生的价值为(j-i)乘上j的权值,最大化
从0跳到n的价值,不能往回跳。n小于等于100000。
题解:比较容易想到n方做法,100分做法不唯一,可以单调队列进行优化。

the end

由于我的水平有限,难免会有些写错的地方,希望大家批评指正,多多包容,thank you for your patience.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述: 给定两支队伍的比分,已知每一局比的胜负,求哪支队伍可能获得这场比的胜利。 规则如下: - 比共进行 $n$ 局,每局比要么由一支队伍获胜,要么由另一支队伍获胜,不可能出现平局。 - 获得比胜利的队伍必须在 $n$ 局比中获胜至少 $\left\lceil\frac{n}{2}\right\rceil$ 局。 输入格式: - 第一行一个整数 $n$,表示比总共进行了 $n$ 局 $(1≤n≤100)$。 - 第二行一个整数 $a$,表示第一支队伍得分 $(0≤a≤n)$。 - 第三行一个整数 $b$,表示第二支队伍得分 $(0≤b≤n)$。 - 接下来 $n$ 行,每行给出一局比的结果,用 0 表示第一支队伍获胜,用 1 表示第二支队伍获胜。 输出格式: - 如果第一支队伍可能获得比胜利,则输出 0。 - 如果第二支队伍可能获得比胜利,则输出 1。 - 如果两支队伍都有可能获得比胜利,则输出 -1。 思路分析: 根据题目描述,我们可以得知,获得比胜利的队伍必须获胜至少 $\left\lceil\frac{n}{2}\right\rceil$ 局,因此,我们需要统计两支队伍分别获胜的局数。 对于一局比,如果第一支队伍获胜,则将第一支队伍的胜利局数加一,如果第二支队伍获胜,则将第二支队伍的胜利局数加一。 统计完两支队伍分别获胜的局数后,判断哪支队伍可能获得比胜利即可。 代码实现: 时间复杂度:$O(n)$ 空间复杂度:$O(1)$ ```c #include <stdio.h> int main() { int n, a, b; scanf("%d%d%d", &n, &a, &b); int cnta = 0, cntb = 0; for (int i = 1; i <= n; i ++ ) { int x; scanf("%d", &x); if (x == 0) cnta ++ ; else cntb ++ ; } int m = (n + 1) / 2; if (a + cnta >= m && b + cntb < m) printf("0\n"); else if (b + cntb >= m && a + cnta < m) printf("1\n"); else printf("-1\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值