【acm】杀人游戏(hdu2211)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2211
杀人游戏
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3624 Accepted Submission(s): 1182
10 3
解法一:插数法(来源:http://www.cnblogs.com/yuyixingkong/p/3254566.html)
- #include<stdio.h>
- int main()
- {
- __int64 t,n,k,count,luck,s,p,i;
- scanf("%I64d",&t);
- while(t--)
- {
- scanf("%I64d%I64d",&n,&k);
- p=k-;//插入周期eg:k=3,那么p=2;两个一插
- for(s=k;s<n+1;)//s为标记,来标记luckboy的位置
- {
- i=(s-)/p;//计算s前面插几个
- luck=s;//luck是记录上一个s的值
- s=s+i;
- }
- printf("%I64d\n",luck);
- }
- return ;
- }
以样例代码为例(如下图所示),即参数为10,3.S代表最后一个被杀的人,下面表示如果杀到最后一轮,3号是最后一个被杀掉的。那么倒数第二轮他应该在四号位置,并且倒数第二轮应该比倒数第一轮多一个人。依次类推,倒数第三轮他在五号位置,此时有六个人。需要注意的是S后面的人其实是可有可无的,对结果不影响,观察第三行和第二行,可以得到,输入(5,3)和(6,3)都是一样的结果,结果都是S(5)。第四行就可以得到输入(7,3,)(8,3)(9,3)都是得到S(7)。这样通过下面的流程图可以得到任意(x,3)问题的解。那么怎么得到所有的解呢。
我们可以看到,第三行比第二行新插进来1个数,而第四行比第三行多插2个,这规律就是,对于第x个位置的数,前一轮(即上图的下一行)要比现在的位置靠后 (x-1)/(k-1)个,x-1好理解,k-1怎么理解呢,k是每k个人,杀一个,杀完之后,如果要还原回原来个数的人,那么需要每k-1个人插一个。 所以对于现在第x位置的人,x的前一轮的位置就是 x+(x-1)/(k-1)。
关于x的初值,显然x最小应该等于k,一直增加到等于n,结束。以上图为例,n=10,k=3,x才开始为3,一直增长到10结束,结果为10。
n =10,k=3,a=10。其实当k=3时,n=10,是a=10的下限,我们在图中可以看出来当k=3时,n属于10~13,a=10。
同理,随便输一个数 n=10096,k=28,得到 a =9776。
符合k=28,a =9776,这样的n的范围是[9776,10137].
方法二:递归法
- int f(int n,int k)
- {
- if(n==k) return k;
- int t=f(n-n/k,k);
- return t+(t-)/(k-);
- }
- int main()
- {
- int t,n,k;
- scanf("%d",&t);
- while(t--) scanf("%d%d",&n,&k),printf("%d\n",f(n,k));
- return ;
- }
这个比较难理解,需要推导数学公式。
方法三:打表法
- #include <stdio.h>
- #include <string.h>
- #include <iostream>
- using namespace std;
- typedef __int64 LL;
- LL INF=;
- LL save[][];
- int main()
- {
- LL ans,b,d,mid;
- for(LL i=;i<=;i++)
- {
- ans=i;
- for(LL j=;j<;j++)
- {
- b=ans,d=INF;
- while(b<=d)
- {
- mid=(b+d)/;
- if(mid-mid/i == ans)
- break;
- if(mid-mid/i>ans)
- d=mid-;
- else b=mid+;
- }
- if( (mid-)-(mid-)/i==ans ) ans=mid-;
- else ans=mid;
- save[i][j]=ans;
- }
- }
- int T;
- scanf("%d",&T);
- int flag,n,k,cnt;
- while(T--)
- {
- scanf("%d%d",&n,&k);
- for(int i=;;i++)
- {
- if(save[k][i]>n&&save[k][i-]<=n)
- {
- printf("%I64d\n",save[k][i-]);
- break;
- }
- }
- }
- return ;
- }
很暴力,性能远不如前面,但是容易想。
【acm】杀人游戏(hdu2211)的更多相关文章
- 杀人游戏(hdu2211)插入法
杀人游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu2211杀人游戏
Problem Description 不知道你是否玩过杀人游戏,这里的杀人游戏可没有法官,警察之类的人,只有土匪,现在已知有N个土匪站在一排,每个土匪都有一个编号,从1到N,每次杀人时给定一个K值, ...
- 【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率
2438: [中山市选2011]杀人游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1638 Solved: 433[Submit][Statu ...
- 丢沙包游戏(或杀人游戏)的C语言实现
丢沙包游戏(或杀人游戏)用C语言实现: 游戏简述: 杀人游戏(或者丢沙包游戏),设定一些人(人数为:num)一起玩游戏,从某个指定的人(设定为:start)开始轮流扔沙包,扔沙包人的下一个人为1,每隔 ...
- 【BZOJ2438】[中山市选]杀人游戏 Tarjan+概率
[中山市选]杀人游戏 Tarjan+概率 题目描述 一位冷血的杀手潜入\(Na\)-\(wiat\),并假装成平民.警察希望能在\(N\)个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查 ...
- BZOJ 2438:杀人游戏(tarjan+概率)
杀人游戏Description一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, ...
- bzoj2438 杀人游戏 Tarjan强联通
[bzoj2438][中山市选2011]杀人游戏 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查 ...
- BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量
BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...
- bzoj2438: [中山市选2011]杀人游戏(强联通+特判)
2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...
随机推荐
- 团队展示网页 HTML模版
之前帮着领导,参加了iGEM的校内赛的网页制作,一开始也是用的现成的模版,但后面修修改改几乎面目全非了- 这里分享一下自己的网站,可以用做团队展示的网页模版,文件在末尾,大家自行下载吧-- 这里贴两张 ...
- 20155321 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)
实验要求 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Java程序. 实验内容 命令行下Java程序开发 打开windows下的cmd → 输入cd Code命令进入 ...
- 20155322 2016-2017-2 《Java程序设计》实验二《Java面向对象程序设计》
20155322 2016-2017-2 <Java程序设计>实验二<Java面向对象程序设计> 实验目的与内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承 ...
- 20145207《Java程序设计》实验二(Java面向对象程序设计)实验报告
<Java程序设计>实验二(Java面向对象程序设计)实验报告 目录 改变 Java面向对象程序设计实验要求 实验成果 课后思考 改变 看了下之前实验二的整体,很搞笑,大图+代码,没了.. ...
- 修改cmd为utf-8编码:
1.组合键WIN+R键,组合键后就会弹出窗口,然后输入CMD,回车: 2.要修改成UTF8编码,输入命令CHCP 65001(设置为65001): 3.鼠标放在命令窗口的标题部分右键,在弹出的右键菜单 ...
- 【LG4309】【BZOJ3173】[TJOI2013]最长上升子序列
[LG4309][BZOJ3173][TJOI2013]最长上升子序列 题面 洛谷 BZOJ 题解 插入操作显然用平衡树就行了 然后因为后面的插入对前面的操作无影响 就直接在插入完的序列上用树状数组求 ...
- C++ OI图论 学习笔记(初步完结)
矩阵图 使用矩阵图来存储有向图和无向图的信息,用无穷大表示两点之间不连通,用两点之间的距离来表示连通.无向图的矩阵图是关于主对角线对称的. 如图所示: 使用dfs和bfs对矩阵图进行遍历 多源最短路径 ...
- set get方法诡异的空指针异常
发现原来是我的bean没有实例化 我的一直都是这么实例化的: UserEntity userEntity = null;难怪每次用不了set方法 原来是没有实例化 实例化之后就能正常使用了 UserE ...
- hdu2061 Treasure the new start, freshmen!(暴力简单题)
Treasure the new start, freshmen! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...
- 第一篇 数据库MySql
数据库的简介 数据库:存储数据的仓库 数据库管理系统软件 常见的数据库管理软件:甲骨文的oracle,IBM的db2,sql server, Access,Mysql(开源,免费,跨平台). 关系型数 ...