首页 > ACM题库 > 九度OJ > 九度-1072-有多少不同的面值组合?[解题代码]
2013
12-12

九度-1072-有多少不同的面值组合?[解题代码]

题目来源:2002年清华大学计算机研究生机试真题(第I套)

题目描述:

某人有8角的邮票5张,1元的邮票4张,1元8角的邮票6张,用这些邮票中的一张或若干张可以得到多少种不同的邮资?

输入:

题目没有任何输入

输出:

按题目的要求输出可以得到的不同邮资的数目

样例输入:

样例输出:


cpp 代码如下:
#include <stdio.h>
int main(){printf("82\n"); return 0;}
/**************************************************************
	Problem: 1072
	User: coder
	Language: C
	Result: Accepted
	Time:0 ms
	Memory:908 kb
****************************************************************/


  1. 第二块代码if(it != mp.end())应改为if(it != mp.end() && (i+1)!=(it->second +1));因为第二种解法如果数组有重复元素 就不正确

  2. 你的理解应该是:即使主持人拿走一个箱子对结果没有影响。这样想,主持人拿走的箱子只是没有影响到你初始选择的那个箱子中有奖品的概率,但是改变了其余两个箱子的概率分布。由 1/3,1/3 变成了 0, 2/3

  3. 有两个重复的话结果是正确的,但解法不够严谨,后面重复的覆盖掉前面的,由于题目数据限制也比较严,所以能提交通过。已更新算法

  4. 漂亮。佩服。
    P.S. unsigned 应该去掉。换行符是n 不是/n
    还可以稍微优化一下,
    int main() {
    int m,n,ai,aj,bi,bj,ak,bk;
    while (scanf("%d%d",&m,&n)!=EOF) {
    ai = sqrt(m-1);
    bi = sqrt(n-1);
    aj = (m-ai*ai-1)>>1;
    bj = (n-bi*bi-1)>>1;
    ak = ((ai+1)*(ai+1)-m)>>1;
    bk = ((bi+1)*(bi+1)-n)>>1;
    printf("%dn",abs(ai-bi)+abs(aj-bj)+abs(ak-bk));
    }
    }