NEFU高程第三次实验 暴力枚举 何以包邮?

密码箱

小明的密码箱打不开了,小明的密码箱是传统的3位滚轮密码。小明完全不记得他的密码了,所以他从 000开始以升序开始尝试,他已经试到第abc位密码了,可是箱子还是没有打开,他希望你可以将之后10个可能尝试的密码输出,这样他就可以减少一定的工作量,让他波动密码盘更有效率。

每行输入一个整数n(0 < n < 1000);n没有前缀0。

tput输出n之后最多10个可能尝试的密码;输出有前缀0的(用“%03d”的方式输出),每个数据之后有一个空格,

包括最后一个数据。Sample Input 1:5

Sample Output 1:

006 007 008 009 010 011 012 013 014 015<br/>Sample Input 2:995Sample Output2:996 997 998 999

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    int n,i;
    while(scanf("%d",&n)!=-1)
    {
        for(i=n+1;i<=10+n;i++)
        {
            if(i<10)
            printf("%03d ",i);
            if(i>=10&&i<=99)
            printf("%03d ",i);
            if(i>=100&&i<=999)
            printf("%d ",i);
        }
        printf("\n");
    }
    return 0;
}

何以包邮?题目描述

新学期伊始,适逢顿顿书城有购书满x元包邮的活动,小 P 同学欣然前往准备买些参考书。

一番浏览后,小 P 初步筛选出n本书加入购物车中,其中第i 本(1<=i<=n)的价格为ai元。

考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和m在满足包邮条件(m>=x)的前提下最小。

试帮助小 P 计算,最终选购哪些书可以在凑够x元包邮的前提下花费最小?

输入格式

标准输入读入数据。

输入的第一行包含空格分隔的两个正整数 n和x ,分别表示购物车中图书数量和包邮条件。

接下来输入n行,其中第 i 行(1<=i<=n)仅包含一个正整数ai ,表示购物车中第i本书的价格。输入数据保证  本书的价格总和不小于 。

输出格式

输出到标准输出。

仅输出一个正整数,表示在满足包邮条件下的最小花费。

样例1输入

4 100

20

90

60

60

样例1输出

110

样例1解释

购买前两本书(20+90)即可包邮且花费最小。

样例2输入

3 30

15

40

30

样例2输出

30

样例2解释

仅购买第三本书恰好可以满足包邮条件。

样例3输入

2 90

50

50

样例3输出

100

样例3解释

必须全部购买才能包邮。

子任务

70%的测试数据满足:n<=15;

全部的测试数据满足:n<=30,每本书的价格ai<=10000  且x<=a1+a2+...+an 。

#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
    int n,x,s[50],sum,i,min,a;
     while(scanf("%d%d",&n,&x)!=-1)
    {

    for(i=0;i<n;i++)
    {
        cin>>s[i];
        min=min+s[i];
    }
    for(a=0;a<1<<n;a++)
    {
        sum=0;
        for(i=0;i<n;i++)
        {
            if(a&1<<i)
            sum=sum+s[i];
            if(sum>=x&&sum<=min)
            min=sum;
        }
    }
    cout<<min<<endl;
    }
    return 0;

}

陈老师加油

Description

陈老师经常开车在哈尔滨的大街上行走,假设刚开始油箱里有T升汽油,每看见加油站陈老师就要把汽油的总量翻倍(就是乘2);每看见十字路口气油就要减少1升;最后的时候陈老师的车开到一个十字路口,然后车就没油了------就熄火了,陈老师好痛苦啊~~~!

然后他就开始回忆,一路上一共遇到5个加油站,10个十字路口,问造成这种惨烈的境遇有多少种可能?

Input

输入一个T ,(1<=T<=100);

Output

输出可能的方案数。

Sample Input

1

Sample Output

10

#include <iostream>
using namespace std;

int main()
{
    int T,i,a,jiayou=0,x,n=0;
    cin>>T;
    for(a=1;a<1<<14;a++)
    {
        x=T;
        jiayou=0;
        for(i=0;i<14;i++)
        {
            if(a&1<<i)
            {
                jiayou++;
                x=x*2;
            }
            else
            {
                x=x-1;
            }
        }
        if(x==1&&jiayou==5)
            {
                n++;
            }
    }
    cout<<n;
    return 0;

}

二倍的问题

给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。比如给定1 4 3 2 9 7 18 22,得到的答案是3,因为2是1的两倍,4是2个两倍,18是9的两倍。

输入:输入包括n组测试数据。每组数据包括一行,给出2到15个两两不同且小于100的正整数。每一行最后一个数是0,表示这一行的结束后,这个数不属于那2到15个给定的正整数。

输出:对每组输入数据,输出一行,给出有多少个数对满足其中一个数是另一个数的两倍。 

 input  examle:

3

1 4 3 2 9 7 18 22 0

2 4 8 10 0

7 5 11 13 1 3 0

output example:

3

2

0

#include <iostream>

using namespace std;

int main()
{
    int n,j,i,k,a[100],nc,len;
    while(cin>>n)
    {
        for(k=0;k<n;k++)
        {
            for(i=0;;i++)
            {
                cin>>a[i];
                if(a[i]==0)break;
            }
            len=i;
            nc=0;
            for(i=0;i<len;i++)
                for(j=0;j<len;j++)
                if(i!=j&&a[i]==a[j]*2)
                nc++;
                cout<<nc<<endl;
        }
    }
}

优化的代码  考虑时间复杂度

#include <iostream>

using namespace std;
//缩小枚举范围,一次判断i和j位置两个组合数各种组合情况下的倍数关系
int main()
{
    int i,j,k,a[100],nc,n,len;
    while(cin>>n)
    {
        for(k=0;k<n;k++)
        {
            for(i=0;;i++)
            {
                cin>>a[i];
                if(a[i]==0)break;
            }
            len=i;
            nc=0;
            for(i=0;i<len-1;i++)//最后一个数没有必要再继续比较了,外层循环少一次
                for(j=i+1;j<len;j++)//a[j]是不是a[i]的两倍呢
                if(a[i]>a[j]&&a[i]==a[j]*2||a[i]<a[j]&&a[i]*2==a[j])nc++;
                cout<<nc<<endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~羊yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值