A. C05.L08.贪心算法入门

发布于:2025-02-21 ⋅ 阅读:(24) ⋅ 点赞:(0)
这套题包含了历年真题,十分重要!!!!要考试的同学可以参考一下!!
此套题限时3小时。

A. C05.L08.贪心算法入门(一).课堂练习1.书架(SSOI2017五年级t6)

  • 传统题1000ms256MiB

题目描述

为了方便同学们查阅资料,程序设计兴趣小组的辅导老师打算将积攒了很多年的 n 本书放到上课教室的书架上去。

教室的书架是一层一层叠起来的,每一层最多可以放 m 本书。每一层的高度由放在这层中最高的那本书决定的,如果不放书,则认为这层的高度为 0 。为了使每个同学能方便地拿到想要的书,书架的总高度应尽可能低。请编程计算将这 n 本书放在书架上后书架的最小总高度,计算的过程中不考虑书的厚度与书架本身材料的厚度。

输入格式

共 n+1 行。

第 1 行 2 个整数 n 和 m ( 1 ≤ m ≤ n ≤ 100000 ) 。

接下来 n 行, 每行 1 个正整数, 分别表示每本书的高度( 每本书的高度不超过 100 )。

输出格式

一个整数,表示将 n 本书放入书架后书架的最小总高度。

样例

输入数据 1

3 2
20 10 30

Copy

输出数据 1

40

Copy

样例解释

将高度是 30 和 20 的两本书放在一层,则这层的高度为 30 ,将高度是 10 的那本书放在另外一层,则这层的高度为 10 ,则书架的总高度为 40 ,满足最小。

代码

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

B. C05.L08.贪心算法入门(一).课堂练习2礼物

  • 传统题1000ms256MiB

题目描述

国庆马上要到了。小明喜欢的礼物有 n 种分别是:公仔、电子手表、漫画书等。

每种礼物有一件,每种礼物价钱都不一样。小明手头上有 m 元。

小明最多可以买多少件礼物?

输入格式

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

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

输出格式

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

样例

输入数据 1

3 100
40 70 50

Copy

输出数据 1

2

代码

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n,m;
    cin>>n>>m;
    vector<int>a(n);
    for(int i=0;i<n;i++) 
    {
        cin>>a[i];
    }
    sort(a.begin(),a.end());
    int o=0;
    int t=0;
    for(int i=0;i<n;i++) 
    {
        if(t+a[i]<=m) 
        {
            t+=a[i];
            o++;
        } 
        else 
        {
            break;
        }
    }
    cout<<o;
    return 0;
}

C. C05.L08.贪心算法入门(一).课堂练习3.数字圈(DLOI2019t4)

  • 传统题1000ms256MiB

题目描述

当我们写数字时会发现有些数字有封闭区域,有的数字没有封闭区域。

数字 0 有一个封闭区域,数字 1、2、 3 都没有封闭区域,数字 4 有一个封闭区域,数字 5 没有封闭区域,数字 6 有一个封闭区域,数字 7 没有 封闭区域,数字 8 有两个封闭区域,数字 9 有一个封闭区域。

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

输入格式

一个整数 K ( 1 <= K <= 2500 )

输出格式

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

样例

输入数据 1

40

Copy

输出数据 1

88888888888888888888

Copy

输入数据 2

1

Copy

输出数据 2

0

Copy

输入数据 3

2

Copy

输出数据 3

8

代码

#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;
}

D. C05.L08.贪心算法入门(一).课堂练习4.危险的实验(NHOI2015初中)

  • 传统题1000ms256MiB

题目描述

小明最近在上化学课,他需要使用到 n 种化学物质来进行他的实验。在做实验的时候,他需要将所有化学物质放在桌面上,按次序排成一条直线。

然而每一种化学物质都是危险品,对于第 i 个化学物质,如果有另外一个化学物质距离它的距离小于 a_iai​,那么就会发生爆炸。

小明想知道如果要安全的完成他的实验,桌子最短可以多短。

输入格式

第一行一个整数 n ,表示化学物质的个数。

第二行有 n 个整数,第 i 个整数 a_iai​ 表示第 i 个化学物质必须与其他化学物质保持的距离。

数据范围

20% 的数据 , 1 <= n <= 20

50% 的数据 , 1 <= n<= 100000

100% 的数据 , 1 <= n <= 1000000 , 1 <= a_iai​ <= 100000

输出格式

一个整数,表示能够让小明安全完成实验的桌子最小长度。

注意:物品要安原来的次序摆放。

样例

输入数据 1

3
3 1 2

Copy

输出数据 1

5

代码

#include<bits/stdc++.h>
using namespace std;
long long n,a[10000001],o=0;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<n;i++)
    {
        o=o+max(a[i],a[i+1]);
    }
    cout<<o;
    return 0;
}

E. C05.L08.贪心算法入门(一).课堂练习5.最大步数(GCOI2019六年级t2)

  • 传统题1000ms256MiB

题目描述

给出了两个非负整数 P 和 Q。您的任务是使得 P 和 Q 相等。在每一步中,您可以执行以 下两项操作之一: 1、将任何质数加到 P 上。 2、从 Q 减去任何质数。 如果不可能使 P 和 Q 相等,则输出 -1 。否则,输出一个非负整数:可以执行的最大步数。

输入格式

数字 0 和 1 不是质数。

输出格式

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

样例

输入数据 1

5 9

Copy

输出数据 1

2

Copy

输入数据 2

5 10

Copy

输出数据 2

2

Copy

输入数据 3

5 6

Copy

输出数据 3

-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;
}

F. C05.L08.贪心算法入门(一).课堂练习6.渡河(GCOI2019六年级t4)

  • 传统题1000ms256MiB

题目描述

总共有 X 人要坐船过河。

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

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

码头有无穷多小船和大船。

问如何坐船,才能使得总费用最小。

输入格式

一个整数 X。

数据范围

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

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

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

输出格式

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

样例

输入数据 1

4

Copy

输出数据 1

32

Copy

输入数据 2

12

Copy

输出数据 2

72

代码

#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;
}

谢谢欢看!!!!