uva 305 Joseph

简介: 点击打开链接uva 305 思路: 数学+打表 分析: 1 传统的约瑟夫问题是给定n个人和m,每次数m次把当前这个人踢出局,问最后留下的一个人的编号 2 这一题是前k个人是好人,后面k个是坏人。

点击打开链接uva 305

思路: 数学+打表
分析:
1 传统的约瑟夫问题是给定n个人和m,每次数m次把当前这个人踢出局,问最后留下的一个人的编号
2 这一题是前k个人是好人,后面k个是坏人。现在要求最小的m使得没有一个好人被踢出去的情况下k个坏人都被踢出
3 按照传统的方法来分析的话,n个人的编号从0~n-1
   第一次  a[1] = (m-1)%n; // 这里由于人的编号是0~n-1
   第二次  a[2] = (a[1]+m-1)%(n-1);
   第i次     a[i] = (a[i-1]+m-1)%(n-i+1);
   那么我们可以知道每次的删除的人的编号,由于k最大14所以我们可以先打表找到1~14的解,然后输出即可。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int solve(int k){
    int pre;
    int tmp = k+1;
    int n = 2*k;
    while(tmp){
        if((tmp-1)%n >= k && (tmp-1)%n < 2*k){
            pre = (tmp-1)%n;
            int i;
            for(i = 2 ; i <= k ; i++){
               int x = (pre+tmp-1)%(n-i+1); 
               if(x < k || x >= 2*k)
                   break;
               else
                   pre = x;
            } 
            if(i == k+1)
                return tmp;
        }
        tmp++;
    }
}

int main(){
    int k , ans[20];
    for(int i = 1 ; i < 15 ; i++)
        ans[i] = solve(i);
    while(scanf("%d" , &k) && k)
        printf("%d\n" , ans[k]);
    return 0;
}



目录
相关文章
uva375 Inscribed Circles and Isosceles Triangles
uva375 Inscribed Circles and Isosceles Triangles
43 0
uva10112 Myacm Triangles
uva10112 Myacm Triangles
45 0
uva 11806 - Cheerleaders
点击打开链接 题意:在一个n行m列的矩形里面放k个相同的石子,要求第一行,最后一行,第一列,最后一列都要有石子。问有几种方法? 思路: 1 如果题目没有要求“第一行,最后一行,第一列,最后一列都要有石子”,那么答案就是C[n*m][k],我们用C[i][j]表示i个里面选择j个的组合数。
825 0
|
机器学习/深度学习
uva 12470 Tribonacci
点击打开uva12470  思路: 矩阵快速幂 分析: 1 裸题 代码: /************************************************ * By: chenguolin ...
994 0
uva 1160 X-Plosives
点击打开链接uva 1160 思路: 并查集 分析: 1 看懂题目之和就是切菜了 代码: #include #include #include #include using namespace std; const int MAXN...
773 0
|
人工智能
uva 11300 - Spreading the Wealth
点击打开链接uva 11300 思路:数学分析+贪心 分析: 1 首先最终每个人的金币数量可以计算出来,它等于金币总数除以人数n。接下来我们用m来表示每人的最终的金币数 2 现在假设编号为i的人初始化为Ai枚金币,Xi表示第i个人给第i-1个人Xi枚金币,对于第一个人来说他是给第n个人。
865 0
uva 1388 - Graveyard
点击打开链接uva1388 思路:数学 分析: 1 我们把原先的n个墓碑看成是园内的正n变形,现在的n+m个墓碑看成是园内的正n+m变形。那么通过画图我们可以知道当这个两个正多边形有一个点重合的时候移动的总距离最小 2 那么我们把这个圆进...
1019 0
uva10859Placing Lampposts
题意:给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以他为一个端点的所有边,在灯的总数最小的前提下,被两盏灯同时照亮的边数应当尽量大。 分析:d(i,j)表示i的父节点放灯的状态为j(1表示放,0不放),以i为根的树的最小x值     x=Ma+c, a表...
793 0
|
人工智能
uva10382 Watering Grass
题意:有一块草坪,长为l,宽为w,再起中心线的不同位置处装有n个点状的喷水装置。每个喷水装置i可以将以它为中心,半径为ri的圆形区域润湿,请选择尽量少的喷水装置,把整个草坪全部润湿。 分析:对于直径小于宽度的喷水装置其实可以忽略,剩下的问题转换成了最小区间覆盖问题,即:用最少数量的区间去覆盖给定的...
820 0
UVA11646
题意:给定一个圆弧边矩形,长a宽b,周长为400,且两边的圆弧同属一个圆。给出长宽比m:n,求长和宽策略:列方程求解。令k=n/m,则解出a = 200 / (1 + atan(k)*sqrt(1+k*k)); 代码: #include #include using namespace std; int main(){ // freopen("in.
641 0