1,贪心
1)排队打水
#include<bits/stdc++.h>
using namespace std;
const int N=1002;
int a[N];
int m,n,x=0;//n表示人数,m表示水龙头的个数,x表示总时间数
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{cin>>a[i];
}
sort(a+1,a+n+1);//从小到大排序
for(int i=1;i<=n;i++)
{if(i>=m+1)//从m+1开始(贪心) a[i]=a[i]+a[i-m];x+=a[i];
}
cout<<x<<endl;return 0;
}
2)过河的最短时间:
题目洛谷:P1809 过河问题
第一步:快速排序(不赘述)
第二步:我们来解决一下人数小于4的情况
1.剩下3个人
最快的人带着第二快的人过去,然后最快的回来,最后带着最慢的过去(三个人的时间和)
2.剩下两个人
两个人一起过去(两个人的时间和)
第三步:我们处理一下三个人以上的情况
我们的计划是每一轮送过去两个人
两种情况:
①最快的人送两个最慢的人过去(2*最快+倒数第一+倒数第二)
②最快的人把第二快的和最慢的送过去(最快+2*第二+倒数第一)
只需要将这两个值取最小值就行了
注意:开long long保险
#include<bits/stdc++.h>
using namespace std;
int i,n,a[100010];
long long ans;
int main()
{cin>>n;for(i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);while(n>3)//贪心算法{ans+=min(a[1]*2+a[n]+a[n-1],a[1]+a[2]*2+a[n]);n-=2;}if(n==2)ans+=a[2];if(n==3)ans+=a[1]+a[2]+a[3];printf("%lld",ans);return 0;
}