• DP 贪心【p2134】百日旅行


    Background

    重要的不是去哪里,而是和你在一起。——小红

    对小明和小红来说,2014年7月29日是一个美好的日子。这一天是他们相识100天的纪念日。

    (小明:小红,感谢你2场大考时默默的支持,100个日夜的陪伴;感谢你照亮我100个美好的日子,给我留下无数美好的回忆……在这个美好的日子里,我准备带你去旅行。)

    Description

    小明和小红还剩下N天的假期,小明可以安排旅行的计划。如果连续X天旅游,小明需要花旅行费用PXX元;如果连续X天不旅游,小明需要请小红吃饭,花费为Q*X元。(P,Q都是输入的常数)

    请你帮小明写一个程序,计算出假期里他至少需要花费多少元。

    Input

    一行,3个空格隔开的正整数N,P,Q。

    Output

    一行,一个正整数表示小明至少需要花费多少元。

    很明显,这题可以(DP)做.

    首先,由于我们需要考虑连续有多少天旅游或吃饭.

    所以我们可以很容易想到一个(O(n^2))(DP)

    (f[i])代表连续旅游到第(i)天的最小花费.

    (g[i])代表连续吃饭到第(i)天的最小花费.

    转移也是很好想的.(我们可以选择在当前第(i)天停止旅游或吃饭)

    [f[i]=min(f[i],g[j]+(i-j)^2 imes p) \ g[i]=min(g[i],f[j]+(i-j) imes q) ]

    代码

    memset(f,0x3f,sizeof f);
    memset(g,0x3f,sizeof g);
    f[0]=g[0]=0;
    for(R int i=1;i<=n;i++)
    	for(R int j=0;j<i;j++)
    	{
    		f[i]=min(f[i],g[j]+(i-j)*(i-j)*p);
    		g[i]=min(g[i],f[j]+(i-j)*q);
    	}
    
    

    然后这样的话,我们可以得到(90pts)

    但是谁不想试一下满分做法?

    正解是斜率优化,我不会QAQ

    因此考虑贪心做法.

    由于请小红吃饭的代价为(q imes x)

    此时若(x)已知则代价也已知。

    因此考虑枚举(x),即请小红吃饭的天数.

    由于不连续的请小红吃饭会比较便宜,所以我们考虑先带她旅游再在中途请她吃饭.

    即用吃饭的天数(i),将旅游的天数(n-i)分成(i+1)块.

    此时考虑均值不等式,发现均分的时候总花费会最小.

    所以考虑均分即可.

    代码

    #include<cstdio>
    #include<cctype>
    #include<iostream>
    #include<cstring>
    #define N 1008
    #define R register
    using namespace std;
    inline void in(int &x)
    {
    	int f=1;x=0;char s=getchar();
    	while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
    	while(isdigit(s)){x=x*10+s-'0';s=getchar();}
    	x*=f;
    }
    //int f[N],g[N],n,p,q;
    int n,p,q,ans=2147483647LL;
    inline int calc(int sum,int sd)
    {
    	int x=sum/sd,y=sum%sd;
    	return x*x*(sd-y)*p+(x+1)*(x+1)*y*p;
    }
    int main()
    {
    	in(n),in(p),in(q);
    	if(q<=p)
    	{
    		printf("%d",q*n);
    		return 0;
    	}
    	for(R int i=0;i<=n;i++)
    	{
    		int res=n-i,j=i+1;
    		ans=min(ans,i*q+calc(res,j));
    	}
    	printf("%d",ans);
    }
    
  • 相关阅读:
    remove &#39;^M&#39; in shell script
    MyBatis学习总结——实现关联表查询(转)
    SSM框架下结合 log4j、slf4j打印日志
    intellij IDEA里各图标对应的文件类型
    springboot整合shiro
    在Eclipse中如何关联源代码
    windows7 创建http 服务器
    Intellij IDEA 安装和配置jrebel进行项目的热部署
    IntelliJ IDEA 热部署插件 JRebel 安装激活及使用
    idea 安装热部署插件
  • 原文地址:https://www.cnblogs.com/-guz/p/9845347.html
Copyright © 2020-2023  润新知