JOJ 2171 2488 1868 2237
给定一个正整数 N , N 不超过 40 ,问在 N 位由数字 0 、 1 组成的所有串中,没有连续 3 个 1 出现的串的个数是多少。比如 N 为 1 的时候,有 0 、 1 两个, N 为 2 的时候,有 00 、 01 、 10 、 11 四个, N 为 3 的时候, 111 就不合法了,此时这样串有 7 个。
解法:动态规划。所有的串都能按照最末两位分成四组。假设在 n 位合法的 0 、 1 串中,以 00 结尾的串的个数为 f0(n) ,以 01 结尾的串个数为 f1(n) ,以 10 结尾的串个数为 f2(n) ,以 11 结尾的串个数为 f3(n) ,则 n 位合法的 0 、 1 串的总数 f(n)=f0(n)+f1(n)+f2(n)+f3(n) 。当串的长度扩展到 n+1 位时,我们看这它们各自的个数如何动态变化。从 n 位到 n+1 位,只需要在 n 位串的末尾追加一位 0 或一位 1 即可。对四个函数分类讨论:
以 00 结尾:加 0 后变成以 00 结尾,加 1 后变成 01 结尾;
以 01 结尾:加 0 后变成以 10 结尾,加 1 后变成 11 结尾;
以 10 结尾:加 0 后变成以 00 结尾,加 1 后变成 01 结尾;
以 11 结尾:加 0 后变成以 10 结尾,加 1 后不合法。
所以,有: f0(n+1) = f0(n) + f2(n), f1(n+1) = f0(n) + f2(n), f2(n+1) = f1(n) + f3(n), f3(n+1) = f1(n) 。
当 n 为 2 时,有 f0(2) = f1(2) = f2(2) = f3(2) = 1 。这样,经过递推可以很快计算出结果。中间要考虑溢出的情况。当 n = 37 时,结果超过了 70 亿,必须用 double 类型。
JOJ 2488 Function Value: http://acm.jlu.edu.cn/joj/showproblem.php?pid=2488
函数 f(n) 如下定义:当 n=1 时, f(n) = 1 ;当 n 是一个素数时, f(n) = f(n – 1) ;否则, f(n) = f(k) + 1 ,其中 k 是 n 除自身以外最大的因子。输入数据 n 为不超过 2 的 31 次方的正整数。
这个题目直接按题意来做即可。因为 n 是素数时 n-1 ,这就变成了合数,然后再除以 k , k 至少是 2 ,所以 n 最起码被砍到了一半。所以这个题目的计算量就是 O(log(n)) 的。代码如下:
#include <stdio.h>
int main() {
unsigned int n, ans, k;
while ( scanf ( "%u" , &n) != EOF) {
ans = 0;
while (1) {
if (n == 1 || n == 2) { ans++; break ; }
for (k = 2; k * k <= n; k++)
if (n % k == 0) break ;
if (n % k) n--;
else { n /= k; ans++; }
}
printf ( "%u/n" , ans);
}
return 0;
}
JOJ 1868 Blocks: http://acm.jlu.edu.cn/joj/showproblem.php?pid=1868
有 N 个长宽高都为 1 的小立方体,把它们砌成一个长方体或正方体,能得到的最小的表面积是多少。输入数据 N 为不超过 1000 的正整数。
设长宽高分别为 L,W,H ,题目要求就是 L*W*H=N 的情况下, 2*(L*W + L*H + W*H) 的最小值是多少。其中 L,W,H 都是自然数。不需要用数学来分析函数的极值。直接搜索即可。当 L 确定的情况下,问题变成了 W*H = N / L 为常数,求 W+H+W*H 的最小值的问题。枚举 W 即可确定 H 。代码如下:
#include <stdio.h>
int l, w, h;
void solve( int m) {
int t = 2147483647, tw;
for (w = 1; w <= m / 2 + 1; w++) {
if (m % w == 0) {
h = m / w;
if (w + h + w*h < t) {
t = w+h+w*h;
tw = w;
}
}
}
w = tw;
h = m / w;
}
int main() {
int c, n, ans, t;
scanf ( "%d" , &c);
while (c--) {
scanf ( "%d" , &n);
ans = 2147483647;
for (l = 1; l <= n/2 + 1; l++) {
if (n % l == 0) {
solve(n/l);
t = 2 * (l*w + l*h + w*h);
if (t < ans) ans = t;
}
}
printf ( "%d/n" , ans);
}
return 0;
}
JOJ 2237 Hero Ranklist: http://acm.jlu.edu.cn/joj/showproblem.php?pid=2237
Arthur 想要将手下的战士按照能力进行排名 , 选择出得力的助手进行冒险 . 他收集了很多人之间比武的胜负情况,如 A 战胜了 B , B 战胜了 C 等。他发现,这些胜负关系之间彼此互不矛盾,也就是不能出现 C 又战胜了 A 这种情况,但很多人之间并没有比武 , 也就无法衡量谁更强。 在这种情况下, Arthur 想把所有可能的排行榜都列举出来,供他进一步研究。
本题目包括多个 Case 。每个 Case 的第一行有 2 个数字 m,n. m<13 ,代表有多少个人物,每个人物使用一个大写字母表示。之后有 n 行 , n<100, 每一行有 2 个字母 X Y, 中间有一个减号 , 表示 X 战胜过 Y 。可以假定输入没有重复 .
这个题目就是拓扑排序,下面是用回溯写的拓扑排序代码:
void tsort( int step) {
int i, j;
if (step >= m) {
ans[step] = 0;
printf ( "%s/n" , ans);
return ;
}
for (i = 0; i < m; i++) {
if (in[i] == 0 && !visited[i]) {
visited[i] = 1;
for (j = 1; j <= Matrix[i][0]; j++) {
in[Matrix[i][j]]--;
}
ans[step] = 'A' + i;
tsort(step + 1);
for (j = 1; j <= Matrix[i][0]; j++) {
in[Matrix[i][j]]++;
}
visited[i] = 0;
}
}
}
JOJ 2171 2488 1868 2237相关推荐
- Poj(2488),按照字典序深搜
题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...
- CJOJ 2171 火车站开饭店(树型动态规划)
CJOJ 2171 火车站开饭店(树型动态规划) Description 政府邀请了你在火车站开饭店,但不允许同时在两个相连的火车站开.任意两个火车站有且只有一条路径,每个火车站最多有 50 个和它相 ...
- JOJ的2042面试题目的数学推导过程
JOJ的2042题目是一个程序理解题目,这个题目非常有意思,给出了下面一段C++源代码,要求计算出最后的输出结果,源代码如下: #include<cstdio> int main(void ...
- LeetCode 2171. 拿出最少数目的魔法豆
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 给你一个正整数数组 b ...
- 【poj 2488】A Knight's Journey 中文题意题解代码(C++)
题目链接: http://poj.org/problem?id=2488 中文题意: 给出一个p行q列的国际棋盘,马可以从任意一个格子开始走,问马能否不重复的走完所有的棋盘.如果可以,输出按字典序排列 ...
- JOJ——基于爬虫的在线测评系统(Online Judge)
这是一个基于爬虫的在线测评系统(OJ). 相信喜欢刷题的各位大佬应该对OJ并不陌生.本系统旨在使用一个账号,就可以刷遍各个OJ的题目. 系统基于后端SpringBoot.Mybatis-Plus.Th ...
- JOJ 2453 Candy
[JOJ 2453]Candy Description 有N 颗糖果和M 个小孩,老师现在要把这N 颗糖分给这M 个小孩.每个小孩i对每颗糖j 都有一个偏爱度Aij,如果他喜欢这颗糖,Aij = 2, ...
- 编程之美 之 程序理解和时间分析 与JOJ 2042
这是<编程之美>的2.20题目,给出一段C#代码,要求不用电脑,理解程序并回答问题.下面是从C#代码中改写成的C++代码: #include <iostream>#includ ...
- 分酒问题与JOJ 1200 Jugs
JOJ 1200 Jugs 题目链接: http://acm.jlu.edu.cn/joj/showproblem.php?pid=1200 题目的意思是,有两个容器,容量分别为 ca 和 cb , ...
最新文章
- 入行IT,为什么建议你学Java?
- 关于Oracle回收站的一些操作
- AD制图相关问题总结
- 分清DB_NAME、INSTANCE_NAME、ORACLE_SID、SERVICE_NAME、DB_DOMAIN和GLOBAL_DB_NAME
- React Native中pointerEvent属性
- 【Rational Rose使用笔记】用例图
- BufferedWriterTest
- 批量替换文件夹下所有文件的内容
- 解析云原生与云计算本质区别,别再傻傻分不清楚了!
- 2运行内存多大_电脑有没有必要升到16GB内存?今年内存这么便宜?要不要抄底升级到16GB?...
- 什么是最大传输单元(MTU)?什么又是最大分段大小(MSS)以及如何计算?
- 如何理解封装java_理解 Java 的三大特性之封装
- LeetCode 340. 至多包含 K 个不同字符的最长子串
- Kettle 使用JS加密解密
- 树莓派Python开发第8课: PWM实验
- hive3之执行计划(Explain)、Fetch 抓取、本地模式、表的优化、Group By、笛卡尔积、行列过滤
- 算法篇-union-find并查集
- 印度市场救不了苹果手机,也救不了库克
- c语言kbhit函数头文件,有没有办法在标准C中替换kbhit()和getch()函数?
- 【数据结构】 栈的知识点
热门文章
- 05 | 访问控制:如何选取一个合适的数据保护方案?
- 数据安全审计:如何对敏感数据进行加密和访问控制,确保数据的安全性
- 计算机ppt基础知识题库,计算机一级考试试题题库office(2)
- All for Good,谷歌发布社区服务搜索引擎
- 程序员们圣诞快乐,送给心中的女神吧
- Sublime Text3不需破解,另类好方法在此
- 【Python 3.7】喜欢的图书:编写一个名为 favorite_book() 的函数,其中包含一个名为 title 的形参。
- Himall商城图形码帮助类二维码中生成图片(2)
- QVariant 初识
- chia 的 p 图过程详解及优化攻略