• BZOJ:1816 [Cqoi2010]扑克牌 (贪心或二分答案)


    题面

    (solution:)

    这道题难就难在你能否读懂题目的意思,我们将它翻译一下:

    现在我有n根竹子(每根竹子有(c_i)节,每节竹子高度为1),我可以通过消耗一点法力值使某一根竹子的某两节之间再长出特殊的一节,现在我有m点法力值,我需要在保证同一高度只能有不超过1节特殊的竹节的情况下,使最矮的那根竹子高度尽可能的高

    怎么样,会了吧!(最矮的那根竹子高度尽可能的高,这还看不出那么你需要赶紧补补二分答案的知识了)

    (code:)

    #include<iostream>
    #include<cstdio>
    #include<iomanip>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    #include<ctime>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<map>
    #include<set>
    
    #define ll long long
    #define db double
    #define inf 0x7fffffff
    #define min(A,B) (A>B?B:A)
    #define rg register int
    
    using namespace std;
    
    struct su{
    	int k,v;
    }a[55];
    
    int n,m,t,x,ans;
    
    inline int qr(){
    	char ch;
    	while((ch=getchar())<'0'||ch>'9');
    	int res=ch^48;
    	while((ch=getchar())>='0'&&ch<='9')
    		res=res*10+(ch^48);
    	return res;
    }
    
    inline bool cmp_v(su x,su y){return x.v<y.v;}
    
    int main(){
    	freopen("cards.in","r",stdin);
    	freopen("cards.out","w",stdout);
    	n=qr(),m=qr();
    	for(rg i=1;i<=n;++i)
    		a[i].k=i,a[i].v=qr();
    	sort(a+1,a+n+1,cmp_v);
    	ans=t=a[1].v; a[n+1].v=inf;
    	for(rg i=1;i<=n;++i){
    		x=(i-1)?min(m/i,t/(i-1)):(m/i);
    		x=min(x,a[i+1].v-a[i].v);
    		ans+=x,m-=x*i,t-=x*(i-1);
    	}printf("%d
    ",ans);
    	return 0;
    }
    
    
    
  • 相关阅读:
    gbk与utf-8转换
    gdb注意事项
    Ubuntu导入证书
    Ubuntu 修改hosts
    GDB配置与.gdbinit的编写
    linux中用户的主目录~
    关于C++构造函数初始化顺序
    C++中的static关键字的总结
    Flutter移动电商实战 --(2)建立项目和编写入口文件
    Flutter移动电商实战 --(1)项目学习记录
  • 原文地址:https://www.cnblogs.com/812-xiao-wen/p/10366998.html
Copyright © 2020-2023  润新知