20天集训——day2

今天讲贪心分治,这已经是第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; 




猜你喜欢

转载自blog.csdn.net/wangzhuojia/article/details/80931620