贪心算法C++

本文探讨了多种算法的实际应用,包括快速排序、选择排序以及活动安排和导弹拦截策略。通过实例展示了如何在限定条件下最大化效益,如选择每行最大数、最短时间完成任务和最小化导弹拦截系统数量。同时,还涉及了数据结构的运用,如动态规划和贪心算法。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    int ar[m][n];
    int sum=0;
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&ar[i][j]);
 
        }
        sort(ar[i], ar[i]+n);
        sum+=*(ar[i]+n-1);
    }
    printf("%d",sum);
 
 
    return 0;
}
/**************************************************************
    Problem: 1112
    User: 2021035552
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1712 kb
****************************************************************/

题目描述

在N行M列的正整数矩阵中,要求从每行中选出1个数,使得选出的总共N个数的和最大。

已知1< =N< =10,  1< =M< =10

输入

输入数据有多行,第一行是矩阵的行数N和列数M

接下来的N行M列为输入数据(正整数,不超过10000)

输出

输出N行元素和的最大值。

样例输入 Copy

3 3
1 2 3
4 5 6
7 8 9

样例输出 Copy

18

问题 A: 和最大

#include<iostream>
#include<cstdio>
  
using namespace std;
  
int n,aid,a[105],tot=0,sum=0,you;
  
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
tot+=a[i];
}
aid=tot/n;
//////
for(int i=1;i<=n-1;++i)
{
if(a[i]-aid<0)
{
a[i+1]+=a[i]-aid;
sum++;
}
if(a[i]-aid>0)
{
a[i+1]+=a[i]-aid;
sum++;
}
}
printf("%d",sum);
return 0;
}
/**************************************************************
    Problem: 1113
    User: 2021035552
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1712 kb
****************************************************************/

题目描述

有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。

        移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

        现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

例如 N=4,4 堆纸牌数分别为:  ① 9 ② 8 ③ 17 ④ 6

        移动3次可达到目的:

        从 ③ 取4张牌放到④(9 8 13 10)->从③取3张牌放到 ②(9 11 10 10)-> 从②取1张牌放到①(10 10 10 10)。

输入

N(N 堆纸牌,1 <= N <= 100)

 A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)

输出

所有堆均达到相等时的最少移动次数。

样例输入 Copy

4
9 8 17 6 

样例输出 Copy

3

问题 B: 分牌

#include<stdio.h>
#include<algorithm>
using namespace std;
struct Time
{
    int start;
    int end;
}a[10001];
int cmp(Time x,Time y)
{   
    return x.end<=y.end;
}
int main()
{
        int t;
        int n,i,s,ans=1;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        scanf("%d%d",&a[i].start,&a[i].end);
        sort(a,a+n,cmp);
        s=a[0].end;
        for(i=1;i<n;i++)
        {
            if(a[i].start>=s)
            {
                 s=a[i].end;
                 ans++;
            }
  
        }
        printf("%d\n",ans);
    return 0;
}
/**************************************************************
    Problem: 1117
    User: 2021035552
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1168 kb
****************************************************************/

题目描述

      学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。    

      现在给出n个活动使用礼堂的起始时间bi和结束时间ei(bi < ei<=32767),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。

输入

第一行一个整数n(n<=1000); 接下来的n行,每行两个整数,第一个bi,第二个是ei(bi < ei<=32767)

输出

输出最多能安排的活动个数

样例输入 Copy

11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13

样例输出 Copy

4

问题 C: 活动选择

#include <iostream>
#include <string>
using namespace std;
  
int main()
{
    string n;
    int a;
    while(cin>>n>>a)
    {
        while(a--)
        {
            int i=0;
            while(n[i]<=n[i+1])
                i++;
            n.erase(i,1);
        }
        int i=0;
        for(i;i<n.size();i++)
            if(n[i]!='0')
            break;
        for(i;i<n.size();i++)
            cout<<n[i];
        cout<<endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1114
    User: 2021035552
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1712 kb
****************************************************************/

题目描述

输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。

输出新的正整数。(N不超过240位)输入数据均不需判错。

输入

n
s

输出

最后剩下的最小数。

样例输入 Copy

175438
4

样例输出 Copy

13

问题 D: 删数问题

#include <iostream>
#include <algorithm>
using namespace std;
  
struct bi
{
    long long m,xjb;
    int s;
};
  
bool cmp(bi a,bi b)
{
    return a.xjb<b.xjb;
}
  
int main()
{
    bi a[5]={0};
    for(int i=1;i<=4;i++)
        cin>>a[i].m;
    long long n;
    cin>>n;
    n*=100;
    a[1].s=25;a[2].s=50;
    a[3].s=100;a[4].s=200;
    a[1].xjb=a[1].m*8;
    a[2].xjb=a[2].m*4;
    a[3].xjb=a[3].m*2;
    a[4].xjb=a[4].m;
    sort(a+1,a+5,cmp);
    long long sum=0;
    for(int i=1;i<=4;i++)
    {
        sum+=n/a[i].s*a[i].m;
        n=n%a[i].s;
        if(n==0)
            break;
    }
    cout<<sum<<endl;
    return 0;
}
/**************************************************************
    Problem: 1175
    User: 2021035552
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1716 kb
****************************************************************/

150

提示

买1瓶2升的饮料和2瓶0.5升的饮料。 这样正好可以买到3升饮料,花费是 90+30+30=150 元。

问题 E: 便利店

#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
    int start;
    int end;
}a[100];
int compare(node a,node b)
{
    return a.end<b.end;
}
   
int main()
{
    int n,i,f,flag;
    while(scanf("%d",&n)&&n)
    {   
        f=1;
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&a[i].start,&a[i].end);
        }
        sort(a,a+n,compare);
        flag=a[0].end;
        for(i=1;i<n;i++)
        {
            if(a[i].start>=flag)
            {
                f++;
                flag=a[i].end;
            }
        }
        printf("%d\n",f);
    }
}
/**************************************************************
    Problem: 1125
    User: 2021035552
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1092 kb
****************************************************************/

题目描述

假期到了,天宝终于可以无压力的看电视了。但是他喜欢的节目有点多,如何尽可能多的看到完整的节目。
他把喜欢的节目时间表给你,请帮他安排一下吧。

输入

输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示天宝喜欢的节目的总数。
接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。
当n=0时,输入结束。

输出

对于每组输入,输出能完整看到的电视节目的个数。

样例输入 Copy

12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0

样例输出 Copy

5

问题 F: 节目安排

#include<iostream>
#include<string>
using namespace std;
bool compare(string a,string b)
{
    if(a+b>=b+a)//ab>=ba,这个时候不需要交换
    {
        return false;
    }
    return true;//ab<ba,这个时候需要交换
}
 
int main()
{
    int n;
    cin>>n;
    string arr[20],temp;
 
    for(int a=0;a<n;a++)
    {
        cin>>arr[a];
    }
 
 
    for(int i=0;i<n-1;i++)
    {
        for(int j=n-1;j>i;j--)
        {
            if(compare(arr[j-1],arr[j]))    //如果为true则交换,
            {
                temp=arr[j];
                arr[j]=arr[j-1];
                arr[j-1]=temp;
            }
        }
    }
    for(int k=0;k<n;k++){
        cout<<arr[k];
    }
    cout<<endl;
    return 0;
}
/**************************************************************
    Problem: 1119
    User: 2021035552
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1712 kb
****************************************************************/

题目描述

设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613

输入

输入格式如下: 第一行为正整数n,第2行为n个正整数,2个正整数之间用空格间隔。

输出

输出n个数连接起来的最大整数

样例输入 Copy

3
13  312  343

样例输出 Copy

34331213

问题 G: 最大整数

#include<iostream>
using namespace std;
int a[1005],b[1005],ans;
int main(){
    int i=0,t=0;
    while(cin>>a[i]){
        i++;
    }
    while(t!=i+1){
        ans++;
        int Max=60000;
        for(int j=0;j<=i;j++){
            if(!b[j]&&a[j]<=Max){
                Max=a[j];
                b[j]=1;
                t++;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
/**************************************************************
    Problem: 1115
    User: 2021035552
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1720 kb
****************************************************************/

题目描述

      某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。

       输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。

输入

n颗依次飞来的高度(1≤n≤1000)

输出

要拦截所有导弹最小配备的系统数k

样例输入 Copy

389  207  155  300  299  170  158  65

样例输出 Copy

2

提示

输入:导弹高度: 7  9   6  8  5

输出:导弹拦截系统K=2

输入:导弹高度: 4  3  2

输出:导弹拦截系统K=1

问题 H: 导弹拦截

05-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值