今天讲贪心分治,这已经是第n次讲这东西了。终于我不再是只知道概念了,我终于会用贪心这东西算题了(但分治还不太熟)。
贪心的模板例题我大部分刷了,大概还剩修理牛棚,巧克力,删数问题,难的还有三国游戏,赶吃花的牛。其他的都刷了大概6题。纪念品分组是贪心算法的典型例题了。
纪念品分组:把n个物品分成最少的组数,每组只能有2件物品,且价格总数不能超过k。 就是要把物品尽量分在一起。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,a[110000],x,y,l=0;
cin>>k>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);//将价格从小到大排序
x=1; y=n;
while(x<=y)
{
if(a[x]+a[y]>k) //若超过k单独成组
{
l++;
y--;
}
else
{
l++; x++; y--;
}
}
cout<<l;
}
游荡的奶牛比纪念品分组难一些,但也是典型的例题。
奶牛在草地上有一个活动范围,并且每头奶牛的活动范围不能重复。问有几头奶牛可以一起活动。
#include<bits/stdc++.h>
using namespace std;
struct o
{
int left,right;
}a[51000];
bool cmp(o x,o y)
{
return (x.right<=y.right);
}
int main()
{
int n,l=1,s=1;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].left>>a[i].right;
sort(a+1,a+1+n,cmp);//右端点排序
for(int i=2;i<=n;i++)
if(a[i].left>=a[l].right)//未重复
{
s++; l=i;
}
cout<<s;
}
分治我还是有一点蒙。分治就是“分而治之”。将原问题分为若干个小问题,用递归解决后合并得到原问题。
分治我只打了比赛安排,高级模运算。有N个人进行比赛,要求每人要与其他人都赛一次,每名选手每天比赛一次,要求每天没有选手轮空。求比赛安排表格。
#include<bits/stdc++.h>
using namespace std;
int a[100][100]={};
int main()
{
int n,m,h=1;
cin>>m;
a[1][1]=1;
for(int i=0;i<m;i++)
{
for(int j=1;j<=h;j++)
for(int k=1;k<=h;k++)
{
a[j][k+h]=a[j][k]+h;//右上方方阵
a[j+h][k]=a[j][k]+h;//左下方方阵等于右上方方阵
}
h*=2;
}
for(int i=1;i<=h;i++)
{
for(int j=1;j<=h;j++)
if(a[i][j]<10)
{
cout<<" "<<a[i][j];
}
else
cout<<' '<<a[i][j];
cout<<endl;
}
return 0;