zoukankan      html  css  js  c++  java
  • CF-div2-633-C

    思路

    枚举幂x,加2^x,加到比前面最大值即可,
    因为前x-1个一定能凑出最大值。(前x-1一定能凑出任意比它小的数)

    比如,5 1; 5 > 1 + 2^3;那么前2个一定能凑到5,1 + 4 = 5;
    再如,17 6; 17 > 6 + 2^4 那么前3个一定能凑到17,17与6差值为11,11 = 1011(二进制),那么选2^0 + 2^1 +2^3 = 11;
    再如,17 0;17 > 0 + 2^5 那么前4个选一部分累加一定能凑到17,17与0的差值位17,17 = 10001(二进制),那么选2^0 + 2^4 = 17;

    这因为二进制的性质,能凑出任意比它最高位少的数。

    下图构造出17

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll; 
    
    const int maxn = 1e5+100;
    int t;
    int n;
    ll a[maxn];
    
    void solve(){
    	cin>>n;
    	for(int i = 1;i<=n;i++) cin>>a[i];
    	ll maxc = a[1]; //maxc记录前面的最大值 
    	int ans = 0;
    	for(int i=2;i<=n;i++){
    		if(a[i] < maxc){ //a[i]比maxc小 才考虑增大ai;比maxc大肯定就不考虑增加它了 
    			int x = 0;
    			for(int j=0;j<=31;j++){
    				if(a[i] + pow(2,j) > maxc){ //能加到比maxc大 
    					x = j;
    					break;
    				}
    			}
    			ans = max(ans,x); //前x次(不包含x)一定能凑出与maxc相等的值
    		}
    		maxc = max(a[i],maxc);
    	} 
    	cout<<ans<<endl;
    }
    
    int main(){
    	cin>>t;
    	while(t--){
    		solve();
    	}
    	return 0;
    } 
    
    
  • 相关阅读:
    C++内存管理
    C++STL
    C++OOP
    C++11,17新特性
    淘宝京东拼多多微信返利公众号怎么做绑定
    (教程)淘宝客怎么做淘礼金0元购物软件
    基于devops工具盘古安装wordpress
    可持续集成(devops)工具盘古入门指南
    Nacos在电商系统中的应用
    电商系统自动测试脚本
  • 原文地址:https://www.cnblogs.com/fisherss/p/12689308.html
Copyright © 2011-2022 走看看