| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1303 人关注过本帖, 1 人收藏
标题:发一道题,大家练练手
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏(1)
已结贴  问题点数:50 回复次数:14 
发一道题,大家练练手
问题描述:
    一条街的一边有几座房子。因为环保原因想要在路边种些树。路边的地区被分割成块,并被编号1..n。每个块的大小为一个单位尺寸并最多可种一棵树。每个居民想在门前种些树并指定了三个号码b,c,t。这三个数表示该居民想在b和c之间最少种t棵树。当然,b<c,居民必须保证在指定地区不能种多于地区被分割成块的树,即要求t<c-b+1。允许居民想种树的各自区域可以交叉。出于资金短缺的原因,环保部门请你求出能够满足所有居民的要求,需要种树的最少数量。
   
输入格式:
    第1行为n,表示区域的个数;
    第2行为h,表示房子的数目;
    下面h行三个用空格的数:描述居民的需要b,c,t (0<b<c30,000,t<c-b+1)。

输出格式:
    输出为满足所有要求的最少树的数量。
   
样例输入输出:
trees.in
9
4
1 4 2
4 6 2
8 9 2
3 5 2

trees.out
5

数据范围:
    对于30%的数据,0<n<1,000,0<h<500;
    对于100%的数据,0<n<30,000,0<h<5,000。

[ 本帖最后由 sunyh1999 于 2010-9-7 19:04 编辑 ]
搜索更多相关主题的帖子: 房子 分割 
2010-09-07 17:16
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
有几个错误,修正一下:
“当然,bc”应为“当然,b<c”
“即要求tc-b+1”应为“t<c-b+1”

“下面h行三个用空格的数:描述居民的需要b,c,t (0<bc30,000,rc-b+1)。”
应为: “下面h行三个用空格的数:描述居民的需要b,c,t (0<b<=c30,000,t<c-b+1)。”


欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-07 17:22
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用sunyh1999在2010-9-7 17:22:03的发言:

有几个错误,修正一下:
“当然,bc”应为“当然,b
????是题目有错误么?为什么不在上面直接修改?看两页,很累呢!!!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-07 18:26
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
我会改好的

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-07 19:01
encounter
Rank: 5Rank: 5
来 自:扬州
等 级:职业侠客
威 望:2
帖 子:150
专家分:359
注 册:2010-7-24
收藏
得分:10 
思路
trees.in
9
4
1 4 2
4 6 2
8 9 2
3 5 2

trees.out
5

首先得把输入的数据存入a[][3]
可以先从第一行开始,也可以先按b的大小将行牌下序
找出a[][]中a[0][0]至a[0][1]所有的数出现的次数并记录所在行
然后从次数出现次数最多的数开始减起,所有对应的t都得减1,并把0付给此数
直至a[0][2]等于0
。。。。。。
第二行,3,4,5都一样

我想了一下此题的难点所在
当有多个数出现次数最多且一样多
就得考虑许多相关的行,
就要考虑有这些数的行有没有比它
出现次数更多的数
如果这写出现更多次数的数又有很多个。。。。。。。。。。。。。。。。。


另一种方法
从所有的数出发
找出现次数最多的数
但是还是会出现类似情形
就是出现次数一样多。。。。。。。

版主有好的代码一定得贴上来哟




ping   nbtstat   netstat   tracert    nat   at    ftp   telnet..................
2010-09-07 20:06
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:30 
回复 楼主 sunyh1999
解题方法:
    想要种树种得少,就要让一棵树给多个区间使用,这样,尽量在叠加区间种树。
    处理问题时,先按所有区间的开始位置从小到大排序,若开始位置相同,则按照结束位置由大到小排序。
    之后依次逆序处理每个区间,由于重叠位置一定是区间开始处,所以先在倒数第一个区间开始处种满足要求的树,对前一个区间,看差多少棵就在该区间开始处补种多少。
    最后统计树的总数即可!
    代码现在贴出,请大家测试:
程序代码:
#include   <stdio.h>
#include   <stdlib.h>

int tree[30001];            /* 0表示该位置没有树,1表示该位置有树 */
int a[5001][3]={0};         /* b,c,t                              */
int n,h;                    /* 区域的个数、房子的数量             */
int sum=0;

int plant(int home,int num)
{
    int i;
    for(i=home;i<=30000;i++)
    {
        if(tree[i])
        {
            continue;
        }
        else
        {
            tree[i]=1;
            num--;
            if(!num)break;
        }
    }
    return 0;
}

int count(int home,int end)
{
    int i,num=0;
    for(i=home;i<=end;i++)
        if(tree[i])
            num++;
    return num;
}

long int hsort(int *p,int *q)
{
    long x,y;
    x=*p*30000+(30000-*(p+1));
    y=*q*30000+(30000-*(q+1));
    return x-y; 
}

main()
{
    int  i;
LOOP:
    printf("请输入区域的个数:(输入0则退出)");
    scanf("%d",&n);                     /*输入区域的个数*/
    if(n==0)exit(0);
    for(i=0;i<=n;i++)                   /*初始化所有位置没有树*/
        tree[i]=0;
    printf("请输入房子的数目:");
    scanf("%d",&h);                     /*输入房子的数目*/
    printf("请输入描述居民的需要b c t :(0<b<c<30,000,t<c-b+1)。");
    for(i=0;i<h;i++)                     /*分别输入n条纸带起点与终点*/
    {
        scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
    }
    qsort(a, h, sizeof(a[0]), hsort);    /*按照起点快速升序排序,如遇起点相同,则按末点降序*/
/*    最后一间房子的树从起点开始种   */
    plant(a[h-1][0],a[h-1][2]);
/*    倒数第二间房子依次向前逐个判断   */
    for(i=h-2;i>=0;i--)
    {
/*    判断已经种上的树是否足够     */
        if(count(a[i][0],a[i][1])>=a[i][2])
            continue;                        /*如果足够,则继续*/
        else                                 /*否则,从左端开始找空位种够要求的树*/
            plant(a[i][0],a[i][2]-count(a[i][0],a[i][1]));
    }
    sum=count(1,n);
    printf("最少树的数量为:%d\n",sum);

    goto LOOP;
}



[ 本帖最后由 jack10141 于 2010-9-9 23:39 编辑 ]

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-09 19:36
encounter
Rank: 5Rank: 5
来 自:扬州
等 级:职业侠客
威 望:2
帖 子:150
专家分:359
注 册:2010-7-24
收藏
得分:0 
回复 6楼 jack10141


这题远非这么简单。。。。。。。

ping   nbtstat   netstat   tracert    nat   at    ftp   telnet..................
2010-09-09 23:23
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用encounter在2010-9-9 23:23:11的发言:



这题远非这么简单。。。。。。。
我初步认为这个做法可以得到最优解,要不你给个反例?用我的代码试下??

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-09 23:35
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
找反例的工作交给我吧

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-09 23:56
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用御坂美琴在2010-9-9 23:56:18的发言:

找反例的工作交给我吧
原来版主也认为我的思路有问题?或者我前面的思路写的太简单,大家结合代码理解吧!那么麻烦给个反例我,我也考虑下思路哪里还有什么漏洞没!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-10 00:04
快速回复:发一道题,大家练练手
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040659 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved