2014级第一次选拔赛题解

A回 完全背包转01背包,01背包的二进制优化。

对于N种商品,每种Mi件,收益为Pi,体积为Vi。

可以看做有sigma(M)件这样的商品,每种商品只有要或不要两种状态,于是完全背包转化为01背包。

此时的时间复杂度为O( sigma(Mi)*V ),二进制可以优化到O(sigma(log(Mi) )*V );

对于[1,n]区间内的所有整数可以有2^0,2^1,.,2^i, 以及 n-2^i 组合得到,其中i满足2^i <= n 且 n < 2^(i+1)。

也就是说对于某种有Mi件的商品,我们可以用log(Mi)件来等价替换。

B去 字符串Hash + DP

DP公式显而易见:

若前缀 i 为回文,那么dp[i] = dp[i/2] + 1;

否则 dp[i] = 0;

最终答案为sigma(dp[i])。

难点在于求解快速判断某个前缀是否为回文,两次字符串Hash可以解决。

时间复杂度 预处理O(n) + 每次询问O(1) = O(n)。

此题O(n^2)的判断方法也可以过。

有兴趣可以去试试原题,Codeforces 7D。

C要 算是思维强度比较很小的题了,可以算作模拟题了。

时间复杂度 = O(n) 的dfs预处理 + O(n)的dfs查找 = O(n)。

首先你要知道 以节点i为根的树上的节点数为 dp[i] = sigma(dp[son_j ]) + 1;son_j表示 i 的第 j 的子节点。

D记 就算不知道定理也应该会用Java写啊。。。

(a + b) % m = (a%m + b%m) %m;

(a * b) % m = ( (a%m) * (b%m) ) %m;

对于某个数S,假设一共有N位,每位分别是Ai。

那么S%m = sigma( ( Ai*10^(n-i) )%m ) %m;

其中10^x 又可以按上述定理展开,时间复杂度O(N)。

E得 最小生成树

根据算法定义,现将边按权值升序排序,依次加入途中,当加入某条边时整张图联通,那么显然最后加入的那条边就是答案啊,时间复杂度O(n*log(n) )。

如果看不出这个,也可以二分答案然后并查集或者BFS去验证啊,O(log(MAX) * n)。

F吃 现按输入的 Pi 排序,那么排序后的第一个人应该选较小的,然后第 i 个要在 大于 Key_i-1 的 A,B中选一个较小的作为Key_i。

如果每个人都有的选,那肯定就是Yes,否则就是No。

E 药 本意是签到题,其实真的是签到题,有序链表的增删,不多说了。

时间: 2025-01-12 09:29:54

2014级第一次选拔赛题解的相关文章

2014 北京邀请赛ABDHJ题解

A. A Matrix 点击打开链接 构造,结论是从第一行开始往下产生一条曲线,使得这条区间最长且从上到下递减, #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <stdio.h> #include <vector> #include <set> using namespace std; #defi

2014北京邀请赛(部分题解)

马上要去比赛了. 今天做了一下2014北京邀请赛,出了两道题目,感觉很水啊... 首先H题: H. Happy Reversal Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main Submit Status PID: 34988 Font Size:  +   - Elfness is studying

2014 百度之星题解 1002 - Disk Schedule

Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景. 磁盘有许多轨道,每个轨道有许多扇区,用于存储数据.当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道.具体扇区进行读取操作.为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间.磁头也可以随意移动到某个轨道进行读取,每跳转到一个相邻轨道的时间为400个单位时间,跳

2014级学生程序设计学习大数据

2014级<程序设计基础(二)>正式结束,按惯例将数据做个整理.无论师生,都可以从中找出值得自己总结的东西. 程序设计的水平,让代码行来说话.没有有效积累的,抽出时间,希望还在. 一.发表博文情况统计 1.总体统计 学号 全学年总数量 学期1数量 学期2数量 学期2增量 访问 积分 排名 评论 平均 168.64 92.29 76.35 -15.95 21761.95 1903.61 9810.22 54.04 最大 527 187 340 153 112261 6291 19793 375

2014 百度之星 题解 1004 Labyrinth

Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能走一格,且仅仅能向上向下向右走曾经没有走过的格子,每个格子中都有一些金币(或正或负,有可能遇到强盗拦路抢劫,度度熊身上金币能够为负,须要给强盗写欠条),度度熊刚開始时身上金币数为0,问度度熊走出迷宫时候身上最多有多少金币? Input 输入的第一行是一个整数T(T < 200),表示共同拥有T组数据

ZOJ Monthly, June 2014 月赛BCDEFGH题题解

比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不能加油的站就会wa..太弱.. 唔···太懒第二天才发题解.. B:Gears 并查集 题解:点击打开链接 C:Consecutive Blocks 离散化一下然后模拟 题解:点击打开链接 D:An Easy Game 设dp[i][j]为前i个位置已经匹配了j个位置的方法数. #include <

2017ACM省赛选拔赛题解

Problem A: 聪明的田鼠 题解: dp[k][i]表示走了k步,且在第i行的最大值 最后的结果就是走了n+m-2步,且在第n行的值 代码: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <queue> 5 #include <stack> 6 #include <cstdio> 7 #include <string> 8 #inclu

Clash Credenz 2014 Wild Card Round题解

A题 简单模拟. 1 /************************************************************************* 2 > File Name: A.cpp 3 > Author: Stomach_ache 4 > Mail: [email protected] 5 > Created Time: 2014年09月01日 星期一 08时08分12秒 6 > Propose: 7 *********************

FOJ月赛 2014年11月 题解

Problem A: Yellowstar的第一道题 写个暴力程序会发现若n*r*c 是偶数,则是必败态,输出0.000000 否则对于3*3*3 赢的位置有: 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1为必胜点.也就是说左上角是1,这样扩散出去. 答案就是所有1位置的概率和. 题解:点击打开链接 Problem B easy problem 因为k很小 公式: ((dep[y]-dep[x])%k+1)*val 当确定depx