| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5289 人关注过本帖
标题:博弈问题,归类是数学,看似很简单
取消只看楼主 加入收藏
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:13 
博弈问题,归类是数学,看似很简单
Description
    Lrc为了提高Scau_acm的知名度,决定赞助学校举行一场公平(heimu),公正(heimu),公开(heimu)的有奖游戏,游戏规则如下:
游戏玩家由所有参加者组成,每一回合,主持人会发布一道问题,参加者根据个人喜好,选择回答“是”或者“否”,工作人员会分别统计选“是“,跟选”否“的人数,
然后选的人数多的一方将会被淘汰,如果两方的人数相同或者全部人都选”是“或者全部人都选”否“则这回合不算,这回合重新来过,直到两方人数不同为止,剩下的
人将会留下来继续下一回合,直到只剩下1个人或者2个人的的时候,游戏结束,最终留下来的人,就是本游戏的胜利者,胜利者将会获得由Lrc赞助的丰厚奖金。
    可是Lrc又不想把奖金拱手让人,所以Lrc决定派一些手下假扮参赛者混进游戏中,那么Lrc至少要派遣多少个手下混到参赛者中才能妥妥地把所有的奖金收回来呢?
Lrc最近忙着理财没空想这问题,所以拜托身为acmer的你来编程解决这个问题。

(出题人Hq)



输入格式
第一行输入一个整数t,表示有t组输入;
每组输入包含一个整数n(2<n<1000000000),表示有n个参赛者(包括Lrc的手下);


输出格式
对应每组输入,输出一个整数,表示在这n个人中至少潜伏了多少个lrc的手下;


输入样例
2
3
5


输出样例
2
4
搜索更多相关主题的帖子: 工作人员 有奖游戏 主持人 知名度 数学 
2017-03-27 23:12
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
试过很多次了,就是不知道题目是怎么判定的
2017-03-27 23:16
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
回复 5楼 九转星河
根据你的思路 打的代码,不知道对不对
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int d[100005];
int f(int n)
{
    if(n<=100000&&d[n]) return d[n];
    if(n>3)
    {
        if(n%2) return f((n-1)/2)+f((n+1)/2);
        else return f(n/2-1)+f(n/2+1);
    }
    else return 2;
}
void sol()
{
    int n;
    scanf("%d",&n);
    printf("%d\n",f(n));
}
int main()
{

    for(int i=1;i<20;i++)
        d[i]=f(i);
    for(int i=20;i<=100000;i++)
    {
        if(i%2) d[i]=d[(i-1)/2]+d[(i+1)/2];
        else  d[i]=d[i/2-1]+d[i/2+1];
//    printf("%d\n",d[i]);
    }
    int t;
    scanf("%d",&t);
    while(t--)
    sol();
    return 0;
}

提交上去就错了
2017-03-28 10:12
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
回复 8楼 寒风中的细雨
提交上去错了
2017-03-28 10:14
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
回复 13楼 九转星河
改了一下,不会超时
但是错了
#include <stdlib.h>
#include <math.h>
#include <string.h>
int d[100005];
int f(int n)
{
    if(n<=100000) return d[n];
    if(n>3)
    {
        if(n%2) return f((n-1)/2)+f((n+1)/2);
        else return f(n/2-1)+f(n/2+1);
    }
    else return 2;
}
void sol()
{
    int n;
    scanf("%d",&n);
    printf("%d\n",f(n));
}
int main()
{
    d[3]=2,d[4]=3,d[5]=4,d[6]=5;
    for(int i=7;i<=100000;i++)
    {
        if(i%2) d[i]=d[(i-1)/2]+d[(i+1)/2];
        else  d[i]=d[i/2-1]+d[i/2+1];
    }
    int t;
    scanf("%d",&t);
    while(t--)
    sol();
    return 0;
}
2017-03-28 10:32
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
回复 13楼 九转星河
这种题卡着难受
2017-03-28 10:33
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
回复 19楼 rjsp
我以前写过类似的

发现 在2的n次幂-1的时候是2的n-1次幂 然后到2的n+1次幂-1到时递增为1的

但是交上去错了
2017-03-28 12:27
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
回复 19楼 rjsp
主要问题在于敌方出偶数个人的时候 我方该出多少人

敌方出 2个人 我方出 4 个人是能赢的
敌方出 4个人 我方出 6个人

理论上是可以赢得 我就等他们选到多的人在一边的时候把他们淘汰掉

但是也有可能是一直僵局。。。。

2017-03-28 12:50
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
回复 20楼 九转星河
你这么写,我打不出代码来
2017-03-28 22:08
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
回复 23楼 九转星河
可是我交上去试试错了啊
2017-03-28 22:54
快速回复:博弈问题,归类是数学,看似很简单
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.055733 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved