NOIP真题讲解 传球游戏 接水问题

传球游戏

说明

上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。

游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师在此吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目。

聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有三个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方式有1->2->3->1和1->3->2->1,共2种。

输入格式

输入文件ball.in共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30。

输出格式

输出文件ball.out共一行,有一个整数,表示符合题意的方法数。

样例

输入数据 1

input1 复制代码
3 3

Copy

输出数据 1

output1 复制代码
2

Copy

提示

【来源】noip2008普及组复赛T3。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int f[31][31],i,j,m,n;
int main()
{
    cin>>n>>m;
    f[0][1]=1;
    for(int i=1; i<=m; i++)
        for(int j=1; j<=n; j++)
            if(j==1)
                f[i][j]=f[i-1][n]+f[i-1][2];
            else if(j==n)
                f[i][j]=f[i-1][1]+f[i-1][n-1];
            else
                f[i][j]=f[i-1][j-1]+f[i-1][j+1];
    cout<<f[m][1]<<endl;
    return 0;
}

接水问题

说明

学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。

现在有n名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n编号,i号同学的接水量为wi。接水开始时,1到m号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j完成其接水量要求wj后,下一名排队等候接水的同学k马上接替j同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j同学第x秒结束时完成接水,则k同学第x+1秒立刻开始接水。若当前接水人数n'不足m,则只有n'个龙头供水,其它m−n'个龙头关闭。

现在给出n名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。(noip2010普及组复赛第2题)

输入格式

第1行2个整数n和m,用一个空格隔开,分别表示接水人数和龙头个数。

第2行n个整数w1、w2、......、wn,每两个整数之间用一个空格隔开,wi表示i号同学的接水量。

输出格式

输出只有一行,1 个整数,表示接水所需的总时间。

样例

输入数据 1

input1 复制代码
5 3
4 4 1 2 1

Copy

输出数据 1

output1 复制代码
4

Copy

输入数据 2

input2 复制代码
8 4
23 71 87 32 70 93 80 76

Copy

输出数据 2

output2 复制代码
163

Copy

提示

样例1的说明:

第1秒,3人接水。第1秒结束时,1、2、3号同学每人的已接水量为1,3号同学接完水,4号同学接替3 号同学开始接水。

第2秒,3人接水。第2秒结束时,1、2号同学每人的已接水量为2,4号同学的已接水量为1。

第3秒,3人接水。第3秒结束时,1、2号同学每人的已接水量为3,4号同学的已接水量为2。4号同学接完水,5号同学接替4 号同学开始接水。

第4秒,3人接水。第4秒结束时,1、2号同学每人的已接水量为4,5号同学的已接水量为1。1、2、5号同学接完水,即所有人完成接水。

总接水时间为4秒。

数据范围:

1 ≤ n ≤ 10000,1 ≤m≤ 100 且m≤ n;

1 ≤ wi ≤ 100。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n,m,a[110];
int main(){
	int i,j,x,min;
	cin>>n>>m;
	for(i = 1;i <= n;i++){
		cin>>x;
		min = 1;
		//m个水龙头找最小值存入
		for(j = 2;j <= m;j++){
			if(a[j] < a[min]){
				min = j;
			}
		} 
		
		a[min] += x;
	}
	
	//找最大值
	int max = a[1];
	for(i = 2;i <= m;i++){
		if(a[i] > max){
			max = a[i];
		}
	}	
	cout<<max<<endl; 
}
相关推荐
还没想好1233 分钟前
R语言,剪切板双向转,临时处理数据
开发语言·r语言
yuanbenshidiaos30 分钟前
算法
算法
一只自律的鸡1 小时前
C进阶 程序的环境和预处理
c语言·开发语言
windwind20001 小时前
游戏机制与关卡分析:生化危机4村庄战
游戏·玩游戏·游戏策划·游戏机·关卡设计
码上好玩1 小时前
vscode python pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。()
开发语言·python·pip
minstbe1 小时前
AI开发 - 算法基础 递归 的概念和入门(一) 递归算法的常见应用 PYTHON
算法
苏苏大大1 小时前
【leetcode 06】203.移除链表元素
java·算法·leetcode·链表
sjsjs111 小时前
【多维DP】力扣3366. 最小数组和
算法·leetcode·动态规划
engchina1 小时前
Python中的函数式编程模块:itertools、functools和operator
开发语言·python
ABdolphin1 小时前
C语言-数据结构-查找
数据结构