新报数游戏

题目

蒜头君在和他的朋友们一起玩一个游戏。由于蒜头君的机智,这个游戏由蒜头君担任裁判。

首先,蒜头君会给他们一人一个编号,并且每个人的编号都不相同。接下来的每一回合,蒜头君会给一个数,编号不超过它的最大编号的人要报出自己的编号。如果没有人的编号比蒜头君给出的数要小,那么编号最小的人要报出自己的编号。每个人可以重复报号。

蒜头君会按照一个列表顺次报出每个回合的数,他的朋友们想知道每回合报出的编号应该是多少。你能帮帮他们吗?

输入格式

输入数据共 3 行。 
第一行有两个整数 n, m(1≤n≤105,1≤m≤105≤n≤105,1≤m≤105)分别表示参与游戏的蒜头君朋友的个数,和游戏的回合数。

第二行 n 个整数 ai(1≤ai≤108)ai(1≤ai≤108),表示朋友们每个人的编号。

第三行 mm 个整数 qi(1≤qi≤108)qi(1≤qi≤108),表示每回合蒜头君给的数字。

输出格式

输出共一行,输出 mm 个整数,表示每回合报出的编号。每两个整数之间有一个空格,最后一个整数后面没有空格。

样例输入

5 5
1 5 10 15 20
3 6 12 18 24

输出

1 5 10 15 20

  请使用scanf和printf进行输入和输出。 毫无疑问,你需要一个排序算法——这里你可以随意地使用任何一种方法对数据进行排序:你可以选择自己实现一种常见的排序算法(例如冒泡排序或者归并排序),同样你也可以选择使用qsort或者std::sort,这里我们不做限制。 你还需要一种效率比较高的查找算法——你可以用之前学过的折半查找算法(也叫二分查找算法)来解决这个问题。

#include<iostream>
#include<algorithm>
#define MAX 100000+10
using std::sort;
int finder(int array[],int low,int high,int target)//二分查找
{
    while(low<=high)
        {
            int mid=(low+high)/2;
            if(array[mid]>target)
                high=mid-1;
            else
            low=mid+1;
        }
            return high;
}
int main()
{
    int n,m;
    int a[MAX]; // 朋友编号
    int q[MAX]; // 蒜头君的数字
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++) // 朋友每个人的编号
    {
        scanf("%d",&a[i]);
    }
    sort(a,a+n);
    for(int j=0;j<m;j++) // 每回合蒜头君给的数字
    {
        scanf("%d",&q[j]);
    }
    for(int k=0;k<m;k++) // 输出模块
    {
        int c=q[k];
        if(c>=a[n-1]) // 当给出的数大于最大编号时
        {
            printf("%d",a[n-1]);
        }
        else if(c<=a[0]) // 当给出的数小于最小编号时
        {
            printf("%d",a[0]);
        }
        else // 编号不超过它的最大编号时
        {
            printf("%d",a[finder(a,0,n,c)]);
        }
        if(k!=m-1) printf(" ");
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/fuhang/p/8932967.html

时间: 2024-10-12 05:10:18

新报数游戏的相关文章

BZOJ 3105: [cqoi2013]新Nim游戏

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1064  Solved: 624[Submit][Status][Discuss] Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游

3105: [cqoi2013]新Nim游戏 异或高消 &amp;&amp; 拟阵

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 535  Solved: 317[Submit][Status][Discuss] Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏

湖南省第七届大学生计算机程序设计竞赛 报数游戏

报数游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述     n 个人站成一行玩一个报数游戏.所有人从左到右编号为 1 到 n.游戏开始时,最左边的人报 1,他右边的人报 2,编号为 3 的人报 3,等等.当编号为 n 的人(即最右边的人)报完 n 之后,轮到他左边的人(即编号为n-1 的人)报 n+1,然后编号为 n-2 的人报 n+2,以此类推.当最左边的人再次报数之后,报数方向又变成从左到右,依次类推. 为了防止游戏太无聊,报数时有一个特例:如果应该报的数

报数游戏

B - 报数游戏Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64uSubmit StatusDescriptionn个人站成一行玩一个报数游戏.所有人从左到右编号为1到n.游戏开始时,最左边的人报1,他右边的人报2,编号为3的人报3,等等. 当编号为n的人(即最右边的人)报完n之后,轮到他左边的人(即编号为n-1的人)报n+1,然后编号为n-2的人报n+2,以此类推. 当最左边的人再次报数之后,报数方向又变成从

【BZOJ-2460&amp;3105】元素&amp;新Nim游戏 动态维护线性基 + 贪心

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Status][Discuss] Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏

BZOJ3105: [cqoi2013]新Nim游戏

题解: 线性基?类似于向量上的基底. 此题题解戳这里:http://blog.csdn.net/wyfcyx_forever/article/details/39477673 代码: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #incl

【bzoj3105】【新Nim游戏】【bzoj2460】【元素】

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 585 Solved: 350 [Submit][Status][Discuss] Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏

BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基

一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一下序,从大到小求. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<cmath> 6 #include<algor

【BZOJ3105】[cqoi2013]新Nim游戏 贪心+线性基

[BZOJ3105][cqoi2013]新Nim游戏 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴.可以一堆都不拿,但不可以全部拿走.第二回合也一样,第二个游戏者也有这样一次机会.从第三个回合(又轮到