acm新手小白必看系列之(3)——暴力枚举精讲及例题
暴力枚举说白了就是列举所有情况,然后一个一个排查。
这节多说无益直接上题(这节假的精讲)
1·大乐透
在小明曾经玩过的一种对号码的纸牌游戏(乐透)里,玩家必须从{1,2,……,49}中选择6个数。玩Lotto的一个流行策略是(虽然它并不增加你赢的机会):就是从这49个数中,选出k(k>6)个数组成一个子集S,然后只从S里拿出牌来玩几局游戏。例如,k=8,s={1,2,3,5,8,13,21,34},那么有28场可能的游戏:[1,2,3,5,8,13],[1,2,3,5,8,21],[1,2,3,5,8,34],[1,2,3,5,13,21],……,[3,5,8,13,21,24]。
读取数字k和一组数S,输出由S中的数组成的所有可能的游戏。
Input
输入数据有多组,每组一行,每行有多个整数,其中第一个整数为数字k,接下来有k个整数,即子集S。当k为0,输入结束。
Output
输出由S中的数组成的所有可能的游戏。每种游戏一行。
Sample Input
7 1 2 3 4 5 6 7
0
Sample Output
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7
Hint
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int k;
while(scanf("%d",&k)!=EOF)
{
int s[k],i,j,m,i1,i2,i3,i4,i5,i6;
for(i=0;i<k;i++)
{
scanf("%d",&s[i]);
if(s[i]==0)//当k为0,输入结束
break;
}
for(i1=0;i1<k-5;i1++)
{
for(i2=i1+1;i2<k-4;i2++)
{
for(i3=i2+1;i3<k-3;i3++)
{
for(i4=i3+1;i4<k-2;i4++)
{
for(i5=i4+1;i5<k-1;i5++)
{
for(i6

本文详细讲解了ACM竞赛中的暴力枚举策略,通过五个具体例题,包括大乐透号码组合、矩形覆盖判断、寻找特定位置的人、楼层号转换以及比例简化,深入浅出地解析了暴力枚举的实现方法。
最低0.47元/天 解锁文章
3662

被折叠的 条评论
为什么被折叠?



