贪心算法——一种思想的算法

与其说贪心算法是一种算法,不如说贪心算法是一种思想。

贪心嘛,人的本性,总是想要获得更多的利益,却不会放眼全局,所以贪心算法的思想

就是在眼前选择最优的方案。但是贪心无法顾及全局,所以在做题前,要先用数学确定

是否可以使用贪心。

详见 贪心算法_百度百科 (baidu.com)

接下来给大家看几道题的题解:

1962: 排队接水(经典):

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n;
double sum;
int tot;
struct a{
    int t;
    int number;
}x[1005];
bool cmp(a x,a b){
    return x.t<b.t;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x[i].t;
        x[i].number=i;
    }
    sort(x+1,x+n+1,cmp);
    for(int i=1;i<=n;i++){
        cout<<x[i].number<<" ";
    }
    cout<<endl;
    for(int i=1;i<=n;i++){
        sum+=tot;
        tot+=x[i].t;
    }
    printf("%.2f",sum/n);
    return 0;
} 

2048: 金银岛2

#include<bits/stdc++.h>
using namespace std;
 
int w;
int s;
int ans=0;
int n[100];
int v[100];
void dfs(int t=0,bool sel=0,int sumw=0,int sumc=0){
    if(t>s){
        return;
    }
    if(sel){
        sumw+=n[t];
        sumc+=v[t];
        if(sumw>w){
            return;
        }
        ans=max(ans,sumc);
    }
    dfs(t+1,0,sumw,sumc);
    dfs(t+1,1,sumw,sumc);
}
int main(){
    int t;
    cin>>t;
    while(t--){
        cin>>w>>s;
        for(int i=1;i<=s;i++){
            cin>>n[i]>>v[i];
        }
        ans=0;
        dfs();
        cout<<ans<<endl;
    }   
    return 0;
} 

1044: 【NOIP2002】均分纸牌:

#include<iostream>
using namespace std;
int sum=0;
int cnt;
int main(){
    int n;
    int a[105];
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    int avg=sum/n;
    for(int i=1;i<=n;i++){
        int d=a[i]-avg;
        if(d==0){
            continue; 
        }else{
            a[i+1]+=d;
            cnt++;
        }
    }
    cout<<cnt;
    return 0;
} 

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值