hdu1913详解

买电脑问题<你倒是点啊>

题意:每台电脑价钱一样,买一台要c元,买了要包养(保养),m(1,2)就是第一年和第二年一起的保养花费。

电脑肯定每年都要用,怎么取舍是买新电脑,还是保养旧电脑,找出最小花费。


测试数据分析:一台电脑3元,第一年m(1,1)=5,要买还嘚保养,花8元,第二年,用老电脑实际只需要花2元保养即可,买新的要6+3元,花10元,然后第三年,买新的8-6+3,总共花15元,是不是,答案不是,这个思路乱了,使用m(i,j)里的数据是有前提的,就是沿用旧的才有意义,你之前拿的一号机,怎么能去找保养二号机的地方保养呢,更不会说给你更便宜的价格了,应该是第二年买新的8+3+6=17,第三年17+8-6=19。


思路:每年只有两种情况,买新的,用旧的,正如上面所说,要调用后面的m(i,j),必须一开始它刚出的时候就买,分多路线走,一条路线对应一年必须买新的,每多一年只是多一条路线,因为不可能再去买原先出现过的电脑,每年都新出一台电脑,最终判断最少花费的路线即可。


代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define inf INT_MAX
//#define INF 0x3f3f3f3f  细节,为什么这么设?
using namespace std;
int a[1001][1001];
int num[1001][1001];
int main()
{
    int c,n,minn;
    while(scanf("%d",&c)!=EOF){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            for(int j=i;j<=n;j++){
                scanf("%d",&a[i][j]);
                num[i][j]=a[i][j]-a[i][j-1];
            }
        }
        for(int j=2;j<=n;j++){//从第二年开始
            minn=inf;
            for(int i=1;i<=j;i++){//之前的路线+新路线
                if(j==i){
                    for(int k=1;k<i;k++)
                        minn=min(minn,num[k][j-1]);//去年花最少的时候
                    num[i][j]+=minn+c;
                    continue;
                }
                num[i][j]+=num[i][j-1];//旧路线跟进
            }
        }
        minn=inf;
        for(int i=1;i<=n;i++)
            minn=min(minn,num[i][n]);
        printf("%d\n",minn+c);
    }
    return 0;
}

细节问题:

#define INF 0x3f3f3f3f

为什么设无穷大要设成这个样子?因为0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff(32-bit int的最大值)一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。

另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。

最大好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a)),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数了,因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f 所以要把一段整型数组全部置为无穷大,我们只需要 memset(a,INF,sizeof(a))。

原文链接


min和max

 并不清楚为什么,在电脑上只需要iostream,网上编译要加algorithm。

网上的说法就更多了,什么cstdlib,windows.h,windef.h了,麻烦,不如自己宏定义。

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

另外,min,max是可以重载的,就像这样

string min(string a,string b)
{
    if(a.compare(b)>0)
        return a;
    else
        return b;
}
int min(int a,int b)
{
    return a+b;
}

很有意思

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值