C++ 算法篇 贪心习题答案

1、接水问题  NOIP2010普及组

思路暴力模拟。

我们定义一个数组:a[i],表示第 i 个水龙头目前的总时间。

1、每次输入一个数就加入第一个水龙头。

2、然后从小到大排序。所以a[0]j 每次都是时间最小的那个水龙头 。

3、重复1,2。

4、最后输出时间最长的水龙头。

voctor版

#include<bits/stdc++.h>
using namespace std;
int main()
{   int n,m;
    cin>>n>>m;
    vector <int> a;//有m个水龙头,初始没人,时间总和为0
    a.resize(m,0);
    int b;
    for(int i=0;i<n;i++)
    {
        cin>>b;//读入数据
        a.at(0)=a.at(0)+b;//数据加进时间总和最少的水龙头里
        sort(a.begin(),a.begin()+m);//快排,刚好从小到大
    }
    cout<<a[m-1]<<endl;//输出最后一个(时间总和最大的)
    return 0;
}

数组版

#include<bits/stdc++.h>
using namespace std;
int main()
{   int n,m;
    cin>>n>>m;
    int a[m]={0};//有m个水龙头,初始没人,时间总和为0
    int b;
    for(int i=0;i<n;i++)
    {
        cin>>b;//读入数据
        a[0]=a[0]+b;//数据加进时间总和最少的水龙头里
        sort(a,a+m);//快排,刚好从小到大
    }
    cout<<a[m-1]<<endl;//输出最后一个(时间总和最大的)
    return 0;
}

 

2、纪念品分组  NOIP2007普及组

这道题是一个贪心题,读入之后先用sort排序,然后用两个指针一起向中间走,每次选择都尽可能的让当前状态下最大的和最小的分在一组,如果不行就最大的单独分一组,这样贪心下来就是最少分的组了。

#include<bits/stdc++.h>
using namespace std;
int W,ans=0;
int n,a[30001];
int l,r,i;
int main()
{   scanf("%d%d",&W,&n);
    for(i=1;i<=n;i++)
      scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    l=1;  r=n;
    while(l<=r)//一定要有等号。
    {
        if(a[l]+a[r]<=W)   //一定要有等号。
          l++,r--,ans++;
        else
          r--,ans++;   //贪心过程
    }
    printf("%d",ans);
    return 0;
}

3、积木大赛  NOIP2013提高组

贪心策略:每当我们扫到一个数,如果它大于前一个数答案就加上差值,正确性?

这是比较显然的,如果比前一个数小,那么减前一个数时就可以顺便把他减掉,如果大于则还得自己减。

#include <iostream>
using namespace std;
int main()
{
    int n,a,last=0,ans=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        if(a>last) ans+=(a-last);
        last=a;
    }
    cout<<ans<<endl;
}

4、铺设道路  NOIP2018  提高组

#include <iostream>
using namespace std;
int main()
{
    int n,a,last=0,ans=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        if(a>last) ans+=(a-last);
        last=a;
    }
    cout<<ans<<endl;
}

5、均分纸牌   NOIP2002  提高组

这个题最关键的是贪心的思想,想明白了代码实现应该就没有问题了

因为每堆牌只能移到相邻的堆,不妨一堆堆处理,且只考虑后一堆(因为前一堆已经处理好了,再移动会造成浪费)。

那么如果出现了负数呢?如1,1,7的情况,从左到右处理过程如下:

1,1,7

-2,-2,4

0,-4,4

0,0 ,0

#include<bits/stdc++.h>
using namespace std; 
int a[10010];
int n;
int sum=0,x=0,to1=0;
int main()
{   cin>>n;
    for(int i=1;i<=n;i++)
    {  cin>>a[i];
       sum+=a[i];
    }
    x=sum/n;
    for(int i=1;i<=n;i++) a[i]=a[i]-x;
    for(int i=1;i<=n;i++)
    {   if(a[i]==0) continue;
        a[i+1]=a[i]+a[i+1];
        to1++;
    }
    cout<<to1;
    return 0;
}

 

 

6、导弹拦截   NOIP1999普及组

 

7、三国游戏

 

1、扑克牌

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《数据结构与算法分析C语言版》第四版是一本很好的计算机科学教材,主要介绍了数据结构和算法的基本概念、常见算法的原理与应用以及如何分析和优化算法。这本书涵盖了很多经典算法,比如排序算法、搜索算法、图算法、树算法等等,每一章都给出详细的算法实现以及示例程序,方便读者理解和学习。 书中重点介绍了一些基本的数据结构,如数组、链表、栈、队列、堆、散列表和树等等,给出了它们的定义、特点及具体实现。在讲解数据结构的同时,书中也给出了基本的算法思想和设计方法,如递归、贪心算法、分治算法、动态规划等等,这些都是我们学习算法的基础。 该书的特点是讲解的深入浅出,内容合理分级,循序渐进。同时,书中也对算法进行了分析与评估,详细介绍了时间复杂度和空间复杂度等概念,以及如何分析算法的正确性和效率。 总的来说,《数据结构与算法分析C语言版》第四版是一本非常好的计算机科学教材,适合计算机专业学生和程序员学习,它可以帮助我们更好地掌握基本的数据结构和算法知识,提高我们的编程能力和解决问题的能力。 ### 回答2: 《数据结构与算法分析C语言版第四版》是一本经典的计算机科学教材,这本书的主要目的是为了帮助学生建立起对数据结构与算法的理解和应用。本书涵盖了建立ADT(抽象数据类型)、数组、栈、队列、链表、树、散列表、图等基本数据结构的讲解和建立。同时,本书注重对算法的详细分析和设计,并提供了大量的实例来帮助读者加深对这些算法的理解。 本书首先介绍了很多基本的数据结构概念,并让读者理解抽象数据类型和数据结构之间的关系,进而学习如何使用C语言实现这些数据结构。其次,本书介绍了一些排序算法(插入排序、希尔排序、堆排序、归并排序、快速排序),并对它们的算法复杂度进行了详细的分析。再次,本书还讲述了一些图论的算法,如最短路径算法、最小生成树算法等,并且针对这些算法进行了具体的程序实现。 此外,本书还引入了一些新的主题,如红黑树、跳跃表和B-树。这些主题建立在数据结构和算法的基础上,并结合了实际的计算机领域应用,使得本书更具有实用性。 总之,《数据结构与算法分析C语言版第四版》提供了丰富的案例和实例,通过这些案例和实例可以帮助读者更好的掌握和理解数据结构和算法的相关知识。此外,《数据结构与算法分析C语言版第四版》十分适合计算机科学和相关专业的学生使用。 ### 回答3: 《数据结构与算法分析C语言版》第四版答案书是由Mark Allen Weiss所著,提供针对书中习题的解答。本书作为数据结构与算法的经典教材,是计算机相关专业学生必备的一本教材。 本书的答案一一列举了每一章节中的习题解答,包括了各种图例和代码实现。对于那些需要针对特定问题进行研究的学生或程序员来说,该书提供了一个非常好的参考手册。书中涵盖了很多经典的算法和数据结构,包括排序算法、数据结构设计技巧、表达式结构等等。 该书的另一个亮点是其注重实用性。作者在每章习题的解答中给出了丰富的参考资料和提示。通过这种方式,读者可以学习到实现算法的有效技巧和实际应用的技术。 总之,随着计算机技术的不断进步和革新,数据结构与算法分析C语言版第四版的答案对于计算机科学专业的学生成为了一个非常有用的参考。它帮助读者更好地理解并掌握数据结构与算法的核心概念,并提供了实用的技术指导,为算法编程提供了非常有价值的帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值