zoukankan      html  css  js  c++  java
  • 解题报告: CF587A

    题目链接:CF587A Duff and Weight Lifting
    我又来做(CF)水题刷咕值了
    我们可以考虑贪心,将尽可能多的(w)值合成一个,
    很容易发现,可以用(b_i)来代表值为(i)(w)有多少个,然后从(1)开始扫,对(b_i)(log)
    具体实现:
    容易发现若(log b_i=x),那么我们将(b_i)减去(x),同时将(b_{i+x})的值加(1),如此循环,直至(b_i)(1)(0),这样可以保证利益最大化。
    最后从(0)到最大值扫一遍,如果有取值就将答案(+1)
    这样的复杂度是(mathcal O(nlog n)),可以通过本题。
    毕竟是(A)题,实现起来就十分(naive)了,不过我码风有点毒瘤啊。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define MAXN 1000035
    int n;
    int b[MAXN]={0},a,maxn=0;
    int g[30];
    int log2(int x){return floor(log(x)/log(2));}
    int main()
    {
    	#define read(x) scanf("%d",&x)
    	read(n);
    	g[0]=1;
    	for(int i=1;g[i-1]<1000000;i++) g[i]=g[i-1]*2;
    	for(int i=1;i<=n;i++) read(a),b[a]++,maxn=max(maxn,a);
    	for(int i=0;i<=maxn;i++)
    	{
    		if(!b[i]) continue;
    		int x;
    		while(b[i]>1)
    		{
    			x=log2(b[i]);
    			b[i+x]++;
    			maxn=max(maxn,i+x);//有可能会出现新的最值,要注意
    			b[i]-=g[x];
    		}
    	}
    	for(int i=0;i<=maxn;i++) if(b[i]) b[maxn+1]++;
    	return printf("%d
    ",b[maxn+1]),0;
    }
    

    给个赞呗~

  • 相关阅读:
    Matlab 基础
    C# 基础
    Linux Shell
    【Luogu3381】【模板】缩点
    KMP学习笔记
    品味题目的味道
    【NOI2015】【BZOJ4196】软件包管理器
    宝藏
    状态压缩动态规划
    第一篇随笔
  • 原文地址:https://www.cnblogs.com/tlx-blog/p/12600747.html
Copyright © 2011-2022 走看看