首页 > 试题广场 >

年会抢玩偶游戏

[编程题]年会抢玩偶游戏
  • 热度指数:557 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

某公司年会上,组织人员安排了一个小游戏来调节气氛。游戏规则如下:

N个人参与游戏,站成一排来抢工作人抛来的M个小玩偶。为了增加游戏的趣味和难度,规则规定,参与游戏的人抢到的礼物不能比左右两边的人多两个或以上,否则会受到一定的惩罚。游戏结束时拥有玩偶最多的人将获得一份大奖。
假设大家都想赢得这份大奖,请问站在第K个位置的小招在赢得游戏时,最多能拥有几个玩偶?

输入描述:
输入为用空格分隔的3个正整数,依次为:参与游戏人数N、玩偶数M、小招所在位置K


输出描述:
输出为1个正整数,代表小招最多能够拥有的玩偶数。若没有,则输出0。
示例1

输入

1 1 0

输出

0
示例2

输入

1 3 1

输出

3
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            int N = input.nextInt();
            int M = input.nextInt();
            int K = input.nextInt();
            int result;
            result = getK(N,M,K);
            System.out.println(result);
        }
    }

    public static int getK(int n,int m,int k){
        int max;
        if(n<=0 || m<=0 || k<=0 || k>n){
            return 0;
        }

        for(max=0;max<=m;max++){
            int sum = 0;
            for(int i = 1;i<k;i++){     //把排在他前面的人所得的娃娃数加起来,娃娃数小于0的视为0
                sum += ((max-i)>0?(max-i):0); 
            }
            for(int j = n;j>k;j--){     //把排在他后面的人所得的娃娃数加起来,娃娃数小于0的视为0
                sum += ((max-(j-k))>0?(max-(j-k)):0);
            }
            sum += max;     //再加上他本人的娃娃数
            if(sum<m){        //小于m说明还没达到最大极限值,继续循环
                continue;
            }else if(sum==m){     //max恰好是最佳合理分配
                break;
            }else{               //还没达到满足为max的所需最少娃娃总数的分配,将max-1即可
                max--;    
                break;
            }
        }
        return max;
    }
}
发表于 2018-08-22 16:41:55 回复(0)