Advertisement

算法竞赛入门经典(第2版)第2章

阅读量:
习题2-2 韩信点兵(hanxin)

据说韩信智谋超群,并未直接清点军队的人数。相反地,他只需让士兵们依次以三人一组、五人一组以及七人一组地变换队形即可。每当他观察队伍的最后一列时就能迅速得出总兵力的数量。每组测试用例由三个非负整数组成a, b, c(其中 a<3, b<5, c<7),请计算并返回满足条件的最小总人数(若无解,则提示无解)。已知所有可能情况下的总人数均在10到100之间(含端点)。当数据读取完毕后会自动终止处理,请给出所有结果。

复制代码
    #include <iostream>
    int main()
    {
    	using std::cin;
    	using std::cout;
    	using std::endl;
    	int a[2], b[2], c[2];
    	for (int i = 0; i < 2; i++)
    	{
    		cin >> a[i] >> b[i] >> c[i];
    	}
    	for (int i = 0; i < 2; i++)
    	{
    		int n = 10;
    		while (n >= 10 && n <= 100)
    		{
    			if (n % 3 == a[i] && n % 5 == b[i] && n % 7 == c[i])
    			{
    				break;
    			}
    			n++;
    		}
    		if (n > 100)
    			cout << "Case " << i+1 << ": " << "No answer" << endl;
    		else
    			cout << "Case " << i+1 << ": " << n << endl;
    	}
    	getchar();
    	getchar();
    	return 0;
    }
习题2-2 子序列的和(subsequence)

给定两个满足条件的正整数n和m(其中n小于m且均小于等于1e6),计算并输出从1/n²开始直到1/m²的平方倒数之和,并保留五位小数结果。程序接受多组测试数据作为输入,并在遇到n等于m等于零时程序终止运行。请注意题目中的陷阱设置。

复制代码
    #include<iostream>
    #include<iomanip>
    
    using namespace std;
    
    int main(void)
    {
    	int n, m;
    	while (cin >> n >> m)
    	{
    		if (m == 0 && n == 0)
    		{
    			break;
    		}
    		double sum = 0;
    		int i;
    		int kase = 1;
    		for (i = 0; i <= m - n; i++)
    		{
    			sum += 1.0 / (i + n) * 1.0 / (i + n);
    		}
    		cout << "case " << kase << ": " << setprecision(5) << fixed << sum << endl;
    		kase;
    	}
    }

陷阱就是在n特别大时如果直接n*n就会溢出,所以只能连除两次

习题2-6 排列(permulation)

使用数字1至9生成三个三位数分别为abc、def和ghi,并且每个数字仅使用一次。要求这三个数的比例为1:2:3,请以'abc def ghi'的形式列出所有满足条件的组合。提示:无需过多思考

复制代码
    #include<iostream>
    using namespace std;
    int main(void)
    {
    	int abc, def, ghi;
    	int count = 0;
    	int *p = new int [10];
    	memset(p, 0, 10*sizeof(*p));
    
    	for (abc = 123; abc < 329; abc++)
    	{
    		def = 2 * abc;
    		ghi = 3 * abc;
    
    		p[abc / 100] = 1;
    		p[abc / 10 % 10] = 1;
    		p[abc % 10] = 1;
    
    		p[def / 100] = 1;
    		p[def / 10 % 10] = 1;
    		p[def % 10] = 1;
    
    		p[ghi / 100] = 1;
    		p[ghi / 10 % 10] = 1;
    		p[ghi % 10] = 1;
    
    		for (int i = 1; i < 10; i++)
    			count += p[i];
    		if (count == 9)
    		{
    			cout << abc << " " << def << " " << ghi << endl;
    		}
    
    		memset(p, 0, 10*sizeof(*p));
    		count = 0;
    	}
    	delete[] p;
    	cin.get();
    }

全部评论 (0)

还没有任何评论哟~