贪心算法总结

目录

 

一、 排队接水 1

二、 均分纸牌 2

三、 最大整数 3

 

贪心算法总结

一、排队接水

  • 题解:

这是一个贪心算法的问题。我们需要根据每个人接水的时间来确定排队顺序,使得平均等待时间最小。具体做法如下:

  1. 对于每个人,计算他们在其他所有人都已经接完水之后还需要等待多长时间,即累加前面所有人的接水时间。
  2. 根据每个人需要等待的时间,将所有人按照从小到大的顺序进行排序。
  3. 输出排序后的顺序和对应的平均等待时间。
  • 源码:

#include<bits/stdc++.h>
using namespace std;
long n,i,j,c,t,a[1000],b[1000];
float s;
int main() {
    cin>>n;
    for (i=1;i<=n;i++) {
        cin>>a[i];
        b[i]=i;
    }
    for (i=1; i<=n-1; i++){
        for (j=i+1; j<=n; j++){
            if (a[i]>a[j]) {
                swap(a[i],a[j]);
                swap(b[i],b[j]);
            }
        }
    }
    for (i=1; i<=n;i++){
        c=c+a[i];
        s=s+c;
    }
    for (i=1; i<=n; i++)cout<<b[i]<<" ";
    cout<<endl<<setprecision(2)<<setiosflags(ios::fixed)<<s/n;
}

 

 

二、均分纸牌

  • 题解:

  1. 计算所有纸牌数量的平均值。
  2. 将超过平均值的堆向不足平均值的堆移动纸牌,直到所有堆的纸牌数都相等。
    • 对于超过平均值的堆,优先将多余的纸牌移动到相邻左边或右边的堆中,以此保证每次移动的次数最少。
  • 源码:

#include<bits/stdc++.h>
using namespace std;
int n,a[10010],avg,step;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        avg+=a[i];
    }
    avg/=n;
    int i=1,j=n;
    while(a[i]==avg&&i<=n) i++;
    while(a[j]==avg&&j>=1) j--;
    while(i<j){
        a[i+1]=a[i]+a[i+1]-avg;
        a[i]=avg;
        step++;
        i++;
        while(a[i]==avg&&i<=n)i++;
    }
    cout<<step; 
    return 0;
}

 

三、最大整数

  • 题解:

这是一个排序问题。我们需要将给定的 n 个正整数组成最大的多位整数,可以先将这些数转化为字符串,然后进行比较和排序。

具体做法如下:

  1. 将给定的 n 个正整数转化为字符串。
  2. 对于任意两个字符串 s1 和 s2,判断它们拼接在一起的结果 s1+s2 和 s2+s1 哪个更大,将其作为 s1 和 s2 的大小比较结果。
  3. 根据比较结果对所有字符串进行排序。
  4. 将排序后的字符串依次拼接起来,得到最大的多位整数。
  • 源码:

#include<bits/stdc++.h>
using namespace std;
string a[30];
int n; 
bool cmp(string s1,string s2){
    return s1+s2>s2+s1;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)cout<<a[i];
    return 0;
}

 

posted @ 2023-04-15 20:44  BadJui  阅读(38)  评论(0编辑  收藏  举报