/*
1130: Hanoi - plus
时间限制:1.000s 内存限制:512MB
题目描述
如果将课本上的汉诺塔问题稍做修改:给定 N 只盘子,3 根柱子,但是允许每次最多移动相邻的 M 只盘子(当然移动盘子的数目也可以小于 M), 最少需要多少次?
输入格式
输入数据仅有一行,包括两个数 N 和 M(0 <= M <= N <= 8)
输出格式
仅输出一个数,表示需要移动的最少次数
样例输入
5 2
样例输出
7
#include<stdio.h>
int num = 0;
void move(char a, int n, char c)
{
num++;
}
void hanoi(int n, char x, char y, char z)
{
if (n == 1)
move(x, 1, z);
else{
hanoi(n - 1, x, z, y);
move(x, n, z);
hanoi(n - 1, y, x, z);
}
}
int main()
{
int n, m;
char a, b, c;
scanf("%d %d", &n, &m);
if (n%m == 0)
n /= m;
else{
n /= m;
n++;
}
//加上判断是否整除来确定最终的“圆盘”个数
hanoi(n, 'A', 'B', 'C');
printf("%d", num);
return 0;
}
*/
/*
1129: 随机小礼品
时间限制:1.000s 内存限制:256MB
题目描述
元旦快到了,校学生会让 SM 负责新年晚会的小礼品发放工作。为使得参加晚会的同学所获得的小礼品价值相对均衡,他要把购来的小礼品根据价格进行分组,但每组最多只能包括两件小礼品,并且每组小礼品的价格之和不能超过一个给定的整数。为了保证在尽量短的时 间内发完所有小礼品,SM 希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入格式
输入包含n + 2 行:
第 1 行包括一个整数w,为每组小礼品价格之和的上限。
第 2 行为一个整数n,表示购来的小礼品的总件数。
第 3~n + 2 行每行包含一个正整数pi(5 <= pi <= w),表示所对应小礼品的价格。
输出格式
输出仅一行,包含一个整数,即最少的分组数目。
样例输入
100
9
90
20
20
30
50
60
70
80
90
样例输出
6
提示 / 说明
50 % 的数据满足:1 <= n <= 15
100 % 的数据满足:1 <= n <= 30000, 80 <= w <= 200
#include<iostream>
#include<algorithm>
using namespace std;
int num[30010];
int main()
{
int w, n, ans = 0;
cin >> w >> n;
for (int i = 1; i <= n; i++)
cin >> num[i];
sort(num + 1, num + n + 1);
int i = 1, j = n;
//要有等于,,i=j的时候,就是只剩一个,归到else里ans++
while (i <= j)
{
//最大的和最小的一组
if (num[j] + num[i] <= w)
{
ans++;
j--;
i++;
}
//大的各成一组
else
{
ans++;
j--;
}
}
cout << ans;
return 0;
}
*/
/*
1124: 新手村里最亮的崽
时间限制:1.000s 内存限制:256MB
题目描述
一共有 5 个村民,编号分别为 A、B、C、D、E,他们其中一个在村口看到过锦鲤。
5 个村民各自发言:
A :我和 E 都没有看到过锦鲤
B :锦鲤是被 C 和 E 其中一个看到的
C :锦鲤是被我和 D 其中一个看到的
D :B 和 C 都没有看到过锦鲤
E :我没有看到锦鲤
已知五个村民中有且只有 2 个人说的是真话,请问是谁看到了锦鲤?
若有多个答案,在一行中输出,按字典序,编号之间用空格隔开。
例如
A B C D E(这显然不是正确答案)
#include<stdio.h>
int main()
{
int A, B, C, D, E; //分别表示A,B,C,D,E是否是好人,如果是,其值为1,否则为0。
int a, b, c, d, e; //分别表示A,B,C,D,E的话是否为真,如果是真,则为1,否则为0。
int i = 0, n = 0, j = 0;
char temp = 0;
char answer[6];
for (A = 0; A <= 1; A++)
{
for (B = 0; B <= 1; B++)
{
for (C = 0; C <= 1; C++)
{
for (D = 0; D <= 1; D++)
{
for (E = 0; E <= 1; E++)
{
a = !A && !E;
b = (C + E == 1);
c = (C + D == 1);
d = !B && !C;
e = !E;
if (a + b + c + d + e == 2 && A + B + C + D + E == 1)
{
if (A)
{
answer[i] = 'A';
i++;
n++;
}
else if (B)
{
answer[i] = 'B';
i++;
n++;
}
else if (C)
{
answer[i] = 'C';
i++;
n++;
}
else if (D)
{
answer[i] = 'D';
i++;
n++;
}
else
{
answer[i] = 'E';
i++;
n++;
}
}
}
}
}
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (answer[i] < answer[j])
{
temp = answer[i];
answer[i] = answer[j];
answer[j] = temp;
}
}
}
for (i = 0; i < n; i++)
{
printf("%c", answer[i]);
printf(" ");
}
printf("\n");
return 0;
}
*/
/*
1128: 精打细算
时间限制:1.000s 内存限制:256MB
题目描述
AH 今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 N 元钱就行”。今天一早 AH 就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的 N 元。于是,他把每件物品规定了一 个重要度,分为 5 等:用整数 1~5 表示,第 5 等最重要。他还从网上查到了每件物品的价格(都是整数元)。他希望在不超过 N 元(可以等于 N 元)的前提 下,使每件物品的价格与重要度的乘积的总和最大。
设第 j 件物品的价格为 v[j],重要度为 w[j],共选中了 k 件物品,编号依次为 j1,j2,……,jk,则所求的总和为:
v[j1] * w[j1] + v[j2] * w[j2] + … + v[jk] * w[jk]。(其中 * 为乘号)
请你帮助AH设计一个满足要求的购物单。
输入格式
输入的第 1 行,为两个正整数,用一个空格隔开:
N m
(其中 N(<30000)表示总钱 数,m(<25)为希望购买物品的个数。)
从第 2 行到第 m + 1 行,第 j 行给出了编号为 j - 1 的物品的基本数据,每行有 2 个非负整数
v p
(其中 v 表示该物品的价格(v <= 10000),p 表示该物品的重要度(1~5))
输出格式
输出只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值(<100000000)。
样例输入
1000 5
800 2
400 5
300 5
400 3
200 2
样例输出
3900
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, m, w[35], v[35], f[50005];
scanf("%d %d", &m, &n);
for (int i = 1; i <= n; i++)
{
scanf("%d %d", &w[i], &v[i]);
}
for (int i = 1; i <= n; i++)
{
for (int j = m; j >= w[i]; j--)
{
f[j] = max(f[j], f[j - w[i]] + w[i] * v[i]);
}
}
printf("%d", f[m]);
return 0;
}
*/
/*
1126: 铺瓷砖
时间限制:1.000s 内存限制:512MB
题目描述
有一长度为 N(1 <= N <= 10) 的地板,给定两种不同瓷砖:一种长度为 1,另一种长度为 2,数目不限。要将这个长度为 N 的地板铺满,一共有多少种不同的铺法?
输入格式
输入有多组,每组只有一个数 N,代表地板的长度
输出格式
对于每组数据,输出一个数,占一行,代表所有不同的瓷砖铺放方法的总数
样例输入
4
样例输出
5
#include<iostream>
using namespace std;
int tileWays(int n) {
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
return tileWays(n - 1) + tileWays(n - 2);
}
int main() {
int n;
while (cin >> n) {
cout << tileWays(n) << endl;
}
return 0;
}*/