acm新手小白必看系列之(3)——暴力枚举精讲及例题

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

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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值