首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

如若你认为你是牛人,比较厉害,就来看看这两道c编程题目

2012-08-29 
如果你认为你是牛人,比较厉害,就来看看这两道c编程题目第一题第二题:希望大家多多帮忙啊求思路和源码?[解

如果你认为你是牛人,比较厉害,就来看看这两道c编程题目
第一题



第二题:


希望大家多多帮忙啊···

求思路和源码?

[解决办法]
不是牛人,无能为力
顺便说一句,对找人帮忙还使用激将法之类的行为很反感——当然我不是牛人,所以本来也帮不上楼主,楼主可以无视我的感觉
[解决办法]
这两个题目是一样的吗?

我暂时还没有思路,帮忙顶一下。
[解决办法]
说一下我想的 答题思路应该没问题
说一下规律 : 1、最高的格子一定会爬
2、再取高格子东西的时候尽量取旁边盒子的东西
简单说一下制作方法:
1、制作一个结构体数组包含行和列共5000组数(用链表会麻烦很多,5000*2*2=20000b 不知道能不能分配出来),初始值均为零。
2、找出行数最大的结构体,并查看是否存在相邻在+2以内的列数。
3、通过比较找出3组相加且相邻的3个列,把其中最大的数记录下来,并将结构体中的数清零。
4、返回2,3两个步骤指导全部结构体为零为止。
[解决办法]

探讨

说一下我想的 答题思路应该没问题
说一下规律 : 1、最高的格子一定会爬
2、再取高格子东西的时候尽量取旁边盒子的东西
简单说一下制作方法:
1、制作一个结构体数组包含行和列共5000组数(用链表会麻烦很多,5000*2*2=20000b 不知道能不能分配出来),初始值均为零。
2、找出行数最大的结构体,并查看是否存在相邻在+2以内的列数。
3、通过比较……

[解决办法]
这个算法核心的地方就是递归遍历,其他的都很容易明白的,你看看能理解吗。
C/C++ code
#include <iostream>#include <string.h>using namespace std;int foo2(int a[], int len)//返回最小的爬梯子高度和//a中保存每一列的最上面的物品的高度,a[0]对应第一列,比如a[2]为5,则说明第3列的最上面的物品的高度为5{    if(len<=0)//已经没有物品了,不需要爬梯子    {        return 0;    }    if(len<4)//物品的列数小于4,一次就可以全部取完    {        int tmp = a[0];        for(int i=len-1; i>0; --i)//把len列中最高的物品的高度返回        {            if(a[i]>tmp)            {                tmp = a[i];            }        }        return tmp;    }    else    {        int val = ((unsigned)(-1))>>1;//最大的有符号整数            for(int i=0; i<len-2; ++i)//对所有的取法进行遍历,然后返回最小的爬梯子高度和        {            int val1 = a[i];//val1为取当前的三列物品所需的爬梯子高度            if(a[i+1]>val1)            {                val1 = a[i+1];            }            if(a[i+2]>val1)            {                val1 = a[i+2];            }            int val2 = foo2(a, i) + foo2(&a[i+3], len-i-3);//val2为取剩下的所有列所需的爬梯子高度                        if(val1+val2<val)//判断当前的爬梯子高度和是不是最小的            {                val = val1+val2;//val1+val2当前方案的总的爬梯子高度和            }        }        return val;    }}void wo_bu_shi_niu_ren(void)//对数据进行预处理,然后调用foo2求解。{    int len;    cin>>len>>len;    int *a = new int[len];//数组的每一个值对应每一列的最高物品的高度,较低高度的物品                          //对结果没有影响,不需要保存。如果没有物品,则值为零。    memset(a, 0, len*sizeof(int));//将a初始化为零,架子上是空的    int i;    cin>>i;    while(i-->0)//把物品放到架子上去    {        int r;                int c;        cin>>r>>c;        if(r>a[c-1])//当前物品的高度是否高于已有物品的高度,如果符合条件则替换之        {            a[c-1] = r;        }    }    cout<<foo2(a, len)<<endl;    }int main(){    wo_bu_shi_niu_ren();    return 0;}
[解决办法]
探讨
哦,对了,如果想做,我这里还有一个题目,这是上次那两个题目中的另一个,是以前放错了地方的
这是他的链接地址:
http://topic.csdn.net/u/20120730/14/136d5808-7b18-4355-b198-8d269c34d2ce.html?seed=2073022979&amp;r=79267080#r_79267080

[解决办法]
我怎么觉得题目的测试数据有问题,答案不是14么?表示我弱爆了。。。。。。
这个题目地址:http://nhoijs.nhedu.net/Problem_Show.asp?id=2401

下面是我的代码,由于不能注册那个网站,所有不能测试,先贴上了,求犀利测试数据
C/C++ code
#include<iostream>#include<cstring>#include<algorithm> using namespace std;int R,C,mm;int map[105]; //map[i]保存第i列的最高行 int vis[105]; int ans,num; void dfs(int c,int cnt){     if(vis[c])         return ;     if(map[c] && map[c]>=map[c-1] && map[c]>=map[c+1]){            num+=map[c];         vis[c]=vis[c-1]=vis[c+1]=1;          int f=1;         if(map[c-1]) f++;         if(map[c+1]) f++;          if(cnt+f==mm)             ans=min(num,ans);          for(int i=1;i<=C;i++)             if(map[i] && !vis[i])                 dfs(i,cnt+f);          vis[c]=vis[c-1]=vis[c+1]=0;          num-=map[c];      } } int main(){    int n;     while(scanf("%d%d",&C,&R)==2){          memset(map,0,sizeof(map));          scanf("%d",&n);          int r,c;          while(n--){              scanf("%d%d",&c,&r);              if(r>map[c])                  map[c]=r;           }                         mm=0;          for(int i=1;i<=C;i++)              if(map[i])                  mm++;           ans=0x7fffffff;           for(int i=1;i<=C;i++){               memset(vis,0,sizeof(vis));                             num=0;               if(map[i])                   dfs(i,0);          }           printf("%d\n",ans);     }    return 0;}/*测试数据 5 532 33 44 446 2045 61 16 13 71410 1059 17 65 84 13 211*/ 

热点排行