算法——贪心

来源:互联网 发布:网络龙虎斗如何作假 编辑:程序博客网 时间:2024/06/08 12:36

第一题  修理牛棚

在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。好在许多牛正在度假,所以牛棚没有住满。剩下的牛一个紧挨着另一个被排成一行来过夜。有些牛棚里有牛,有些没有。所有的牛棚有相同的宽度。自门遗失以后,农民约翰很快在牛棚之前竖立起新的木板。他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。农民约翰想将他购买的木板总长度减到最少。给出 M(1<= M<=50)可能买到的木板最大的数目;S(1<= S<=200)牛棚的总数;C(1 <= C <=S) 牛棚里牛的数目,和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。输出所需木板的最小总长度作为的答案。

程序:

#include <stdio.h>
void fun(int a[],int m,int s,int c)
{
 int b[200];
 int i,j,k,q,sum;
 for(i=0;i<c-1;i++)
 {
  b[i]=a[i+1]-a[i]-1;
  printf("%d\n",b[i]);
 }
 sum=s;
 for(i=1;i<m;i++)
 {
  k=b[i-1];
  for(j=i;j<c;j++)
  {
   if(b[j]>k)
   {
    q=b[j];
    b[j]=k;
    k=q;
   }
  }
  sum-=k;
 }
 printf("%d\n",sum);
}
void main()
{
 int d[200]={0};
 int m,s,c,i,j;
 scanf("%d%d%d",&m,&s,&c);
 for(i=0;i<c;i++)
  scanf("%d",&d[i]);
 s=d[c-1]-d[0]+1;
 fun(d,m,s,c);
}

第二题    删数问题

键盘输入一个高精度的正整数N(不超过240位),去掉其中任意S个数字后剩下的数字按左右次序组成一个新的正整数。对给定的N和S,寻找一种删数规则使得剩下得数字组成的新数最小。

程序:

#include <stdio.h>
void main()
{
 char a[240],x;
 int i=0,j,k,p,n;
 x=getchar();
 while(x!='\n')
 {
  a[i]=x;
  i++;
  x=getchar();
 }
 scanf("%d",&n);
 for(j=0;j<n;j++)
 {
  p=0;
  for(k=0;k<i-1;k++)
  {
   x=k;
   if(a[k+1]<0)
    k++;
   if(a[k+1]<a[x])
   {
    a[x]=-1;
    p=1;
    break;
   }
  }
  if(p==0)
  {
   i=i-n;
   break;
  }
 }
 for(j=0;j<i;j++)
 {
  if(a[j]>=0)
   printf("%c",a[j]);
 }
}