贪心算法总结
目录
一、 排队接水 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; }
二、均分纸牌
-
题解:
- 计算所有纸牌数量的平均值。
- 将超过平均值的堆向不足平均值的堆移动纸牌,直到所有堆的纸牌数都相等。
- 对于超过平均值的堆,优先将多余的纸牌移动到相邻左边或右边的堆中,以此保证每次移动的次数最少。
-
源码:
#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 个正整数组成最大的多位整数,可以先将这些数转化为字符串,然后进行比较和排序。
具体做法如下:
- 将给定的 n 个正整数转化为字符串。
- 对于任意两个字符串 s1 和 s2,判断它们拼接在一起的结果 s1+s2 和 s2+s1 哪个更大,将其作为 s1 和 s2 的大小比较结果。
- 根据比较结果对所有字符串进行排序。
- 将排序后的字符串依次拼接起来,得到最大的多位整数。
-
源码:
#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; }