【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104796
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

【问题描述】

John养了若干奶牛,每天晚上奶牛都要进食。由于条件比较简陋,并不一定所有奶牛都能吃到食物。奶牛的进食方式是这样的:John有n个食桶(1<=n<=2000),分别编号为1..n。这些食桶被按照编号排成一行。John将奶牛们分成若干组,每组奶牛总是呆在一起进食的,每组奶牛会提出要求——他们需要吃第start到第end桶中的食物。可能存在若干组奶牛都要吃同一个桶中的食物,从而就产生了冲突,这时John只能满足其中一组的要求,另一些组就只能饿肚子了。

John当然不想让奶牛都饿肚子,所以他希望根据奶牛们提出的请求,满足其中一些组的要求,使得最多的食桶被奶牛食用。这个难题困扰着John,他希望得到你的帮助。

 

【输入文件】

    从文本文件hunger.in中读入数据。

    第一行一个整数n,表示奶牛的组数。(1<=n<=1000)

    第2~n+1行,每行两个整数start和end,描述了一组奶牛提出的请求。

 

【输出文件】

    一个整数,表示最多有多少个食桶可以被食用。

 

【输入输出样例】

输入:

3

1 3

7 8

3 4

 

输出:

5

(满足第1组和第2组奶牛的要求,这样1~3号和7~8号这5个食桶可以被食用)


【参考程序】:

#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
struct node
{
  
int x,y;
} a[
1001];
int f[2001];
int n;
int main()
{
   freopen(
"hunger.in","r",stdin);
   freopen(
"hunger.out","w",stdout);
   scanf(
"%d",&n);
   
int max=-1;
   
for (int i=1;i<=n;i++)
   {
      scanf(
"%d%d",&a[i].x,&a[i].y);
      
if (a[i].y>max) max=a[i].y;
    }
    memset(f,
0,sizeof(f));
    
for (int i=1;i<=max;i++)
    {
       f[i]
=f[i-1];
       
for (int j=1;j<=n;j++)
         
if (a[j].y==i)
          
if (f[a[j].x-1]+a[j].y-a[j].x+1>f[i])
           f[i]
=f[a[j].x-1]+a[j].y-a[j].x+1;
    }
    printf(
"%d\n",f[max]);
    
return 0;
}
posted on 2009-04-16 20:53 开拓者 阅读(827) 评论(0)  编辑 收藏 引用 所属分类: 动态规划&背包

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理