首页 > ACM题库 > HDU-杭电 > HDU 1826 Happy Birthday-模拟-[解题报告] C++
2013
12-23

HDU 1826 Happy Birthday-模拟-[解题报告] C++

Happy Birthday

问题描述 :

一声欢笑一段岁月
一天又添一年年纪
一场相逢一群朋友
一生永伴一窝萝卜
        ―― Wiskey祝

兔子生日罗,大家为她准备了个篝火晚会来庆祝,晚会上大家手拉着手围着篝火玩报数游戏,每个人都被编了个号,因为今天兔子是主角,所以她站在中间,左右都是比她编号大的人,其他人也按着这个规则牵手,即编号小的站中间,左右手各拉着一个比自己编号大的人(不是手牵着手),或者不拉着任何一个人,不形成环。报数游戏规则如下,一个人要等左手边的人报完,再报出自己的编号,接着就是右手边的人报,如果谁傻在那,不知道该谁报的就得出来表演节目。玩了一会后,兔子就感觉没意思了,她换了个规则,先报出自己的编号,再左边的人报数,然后右边。每次都是从兔子开始,兔子是这群人里编号最小的。
Wiskey向来对数字不敏感,虽然他运气很好的通过了第一种规则游戏的考验,但并不表示也能顺利通过第二种规则游戏。现在你的任务就是告诉Wiskey他在第二个序列中的位置。

输入:

第一行两个整数N和M (N<50000),表示人数,M表示Wiskey的编号。
接下有N个整数,表示编号,每个人的编号都不同 。

输出:

输出Wiskey在第二种规则报数序列中的位置。

样例输入:

6 5
0 2 1 4 5 3

6 5
4 2 5 1 3 6

样例输出:

6
4
Hint
The first sample's second sequence is 0,1,2,3,4,5 Please note the Memory Limitation

题目链接:uva 12554 – A Special "Happy Birthday" Song!!!

题目大意:给出n个人的名字,然后由这n个人唱歌,每人一句,要求是每个人都要唱至少一句话,而且不可以在一首歌的中间停止。


解题思路:简单模拟,注意两个坑点就可以了。


#include <stdio.h>
#include <string.h>
const int N = 105;
const char song[16][10] = {"Happy", "birthday", "to", "you", "Happy", "birthday", "to", "you", "Happy", "birthday", "to", "Rujia", "Happy", "birthday", "to", "you"};

char name[N][N];

void sing(int n) {
	int flag = 1;
	for (int i = 0; flag || i % 16; i++) {
		if (i >= n && i % 16 == 0) return;
		printf("%s: %s\n", name[i % n], song[i % 16]);
	}
}

int main () {
	int n;

	while (scanf("%d", &n) == 1)  {
		for (int i = 0; i < n; i++)
			scanf("%s", name[i]);
		sing(n);
	}
	return 0;
}

解题报告转自:http://blog.csdn.net/keshuai19940722/article/details/14107991


  1. 其实国内大部分公司对算法都不够重视。特别是中小型公司老板根本都不懂技术,也不懂什么是算法,从而也不要求程序员懂什么算法,做程序从来不考虑性能问题,只要页面能显示出来就是好程序,这是国内的现状,很无奈。