简单的贪心(一)

礼物 查看测评数据信息

国庆马上要到了。小明喜欢的礼物有n种分别是:公仔、电子手表、漫画书等。每种礼物有一件,每种礼物价钱都不一样。小明手头上有 m 元。小明最多可以买多少件礼物?

输入格式

第一行,两个整数:n m   1 <= n<=100,1<=m<= 100000。

第二行,n个空格分开的整数(每个整数<=1000),代表每种礼物的价钱。 

输出格式

一个整数,小明能买多少件礼物

输入/输出例子1

输入:

3 100

40 70 50 

输出:

2

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[999999],ans,s=0;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        ans+=a[i];
        if(ans>m)break;
        else s++;
    }
    cout<<s;
    return 0;
}

糖果 查看测评数据信息

你有n个盒子,第i个盒子有a[i]颗糖果。你有n个朋友,你打算给每个朋友都送一盒糖果。

为了公平,每个朋友得到的糖果数量要一样多。于是你打算吃掉某些盒子里面的一部分糖果,以达到每个盒子剩下的糖果都一样多。

你至少需要吃掉多少颗糖果?

输入格式

第一行,一个整数t, 表示有t组测试数据,t<=100。

每组测试数据格式如下:

第1行,一个整数n。 1<=n<=50。

第2行,n个整数,第i个整数是a[i]。1<=a[i]<=10000000。

输出格式

共t行,每行一个整数。

输入/输出例子1

输入:

5

5

1 2 3 4 5

6

1000 1000 5 1000 1000 1000

10

1 2 3 5 1 2 7 9 13 5

3

8 8 8

1

10000000

输出:

10

4975

38

0

0

#include<bits/stdc++.h>
using namespace std;
long long m,n,a[9999999],s=0,minn=9999999;
int main(){
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>n;
		for(int j=1;j<=n;j++){
			cin>>a[j];
			if(a[j]<minn)minn=a[j];
		}
		for(int j=1;j<=n;j++){
			if(a[j]!=minn)s=s+(a[j]-minn);
		}
		cout<<s<<endl;
		s=0;
		minn=9999999;
	}
    return 0;
}

数字圈 查看测评数据信息

当我们写数字时会发现有些数字有封闭区域, 有的数字没有封闭区域。 数字 0 有一个封闭区域, 数字 1、 2、3 都没有封闭区域, 数字 4 有一个封闭区域, 数字 5 没有封闭区域, 数字 6 有一个封闭区域, 数字 7 没有

封闭区域, 数字 8 有两个封闭区域, 数字 9 有一个封闭区域。

现在你要构造一个最小的非负整数, 使得它的各位数字的封闭区域的数量加起来的总和恰好等于 K。

输入格式

一个整数 K。 1 <= K <= 2500。

输出格式

满足题意的最小的非负整数。

输入/输出例子1

输入:

1

输出:

0

输入/输出例子2

输入:

输出:

8

输入/输出例子3

输入:

40

输出:

88888888888888888888

#include<bits/stdc++.h>
using namespace std;
int k;
int main(){
    cin>>k;
    if(k==1){
        cout<<0;
        return 0;
    }
    if(k%2==1){
        cout<<"4";
        for(int i=1;i<=k/2;i++)cout<<"8";
    }
    else{
        for(int i=1;i<=k/2;i++)cout<<"8";
    }
    return 0;
}

渡河 查看测评数据信息

总共有 X 人要坐船过河。

一个小船最多可以坐 4 人,一个小船固定收费 32 元。

一个大船最多可以坐 6 人,一个大船固定收费 36 元。

码头有无穷多小船和大船。问如何坐船,才能使得总费用最小。

输入格式

一个整数 X。

输出格式

一个整数,表示最小的总费用。

输入/输出例子1

输入:

4

输出:

32

输入/输出例子2

输入:

12

输出:

72

样例解释

60%的数据, 1 <= X <= 1000

80%的数据, 1 <= X <= 1000000

100 的数据, 1 <= X <= 2000000000

#include<bits/stdc++.h>
using namespace std;
long long x,s,l;
int main(){
    cin>>x;
    if(x<=4)s=32;
    else{
        s+=(x/6)*36;
        l=x%6;
        if(l==5)s+=36;
        if(l==4||l==3)s+=32;
        if(l==2||l==1)s+=28;
    }
    cout<<s;
    return 0;
}

最大步数 查看测评数据信息

给出了两个非负整数 P 和 Q。您的任务是使得 P 和 Q 相等。在每一步中,您可以执行以

下两项操作之一:

1、将任何质数加到 P 上。

2、从 Q 减去任何质数。

如果不可能使 P 和 Q 相等,则输出-1。否则,输出一个非负整数:可以执行的最大步数。

输入格式

一行,两个整数 P 和 Q。 0 <= P,Q <= 10^18

输出格式

一个整数

输入/输出例子1

输入:

5 9

输出:

2

输入/输出例子2

输入:

5 10

输出:

2

输入/输出例子3

输入:

5 6

输出:

-1

#include<bits/stdc++.h>
using namespace std;
long long p,q;
int main(){
    cin>>p>>q;
    if(p>q){
        cout<<-1;
        return 0;
    }
    if(p-q==0){
        cout<<0;
        return 0;
    }
    if(p-q==1){
        cout<<-1;
        return 0;
    }
    cout<<(q-p)/2;
    return 0;
}

小美吃苹果 查看测评数据信息

吃货小美,特别喜欢吃苹果。有一天好朋友lili送给她三箱苹果。第1个箱子里有n1个苹果,第2箱有n2个,第3个箱子有n3个。因为小美比较矫情。所以她在吃苹果时制定了一个规则让箱子里剩余的苹果看起来更舒坦一点儿。
规则1:三个装苹果的箱子位置不允许交换。
规则2:吃完苹果后每个箱子都不能空。
规则3:吃完苹果后三个箱子剩余的苹果数量必须是递增的。也就是说,第1个箱子剩余的苹果数少于第2个箱子,第2个箱子剩余的苹果数少于第3个箱子。

因为小美实在吃得有点饱了,请问小美怎样才能在尽量少吃苹果的前提下让箱子中剩余的苹果数量满足要求呢?
如果可以实现则输出她应该吃多少个苹果,如果她无法完成心愿就输出-1。

输入格式

空格隔开的n1 n2 n3 (三个箱子里苹果的数量 1<= n1,n2,n3 <= 4000 )

输出格式

一个整数,最少需要吃多少个苹果

输入/输出例子1

输入:

15 40 22

输出:

19

#include<bits/stdc++.h>
using namespace std;
int e(int a,int b,int c){
    if(a<b&&b<c&&a>0)
        return 0;
    if(a<1||b<2||c<3)
        return -1;
    int count=a+b+c;
    while(a>=b||b>=c){
        if(a>=b)
            a--;
        if(b>=c)
            b--;
    }
    return count-a-b-c;
}
int main(){
    int a,b,c,n;
    cin>>a>>b>>c;
    cout<<e(a,b,c);
    return 0;
}

购书 查看测评数据信息

书店稿促销优惠活动:“买 3 本免费 1 本”。即如果你买 3 本书,价格最便宜的那本书就不收钱。如果买很多书, 不同分组优惠的价格可能不同。比如,买 7 本书,价格分别是:10,3,2,4,6,4,9。 如果分组是: (10,3,2),(4,6,4)和(9),第一组免费价格 2,第二组免费价格 4,第三组不能免费。

现在,你买了 N 本书,请恰当分组(每组 1 本到 3 本),使得花费最少?

输入格式

第一行包含 1 个整数 N, 1≤N≤100000。

下面 N 行,每行 1 个整数 Ci 表示一本书的价格。 1≤ Ci ≤ 100000。

输出格式

一个整数,最少付款是多少。

输入/输出例子1

输入:

4  

3 2 3 2

输出:

8

输入/输出例子2

输入:

6

6 4 5 5 5 5

输出:

21

#include <bits/stdc++.h>
using namespace std;
bool cmp(int x,int y){
	return x>y;
}
int n,a[100001],s=0;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++)if(i%3!=0)s+=a[i];
	cout<<s;
	return 0;
}
  • 32
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值