其他分享
首页 > 其他分享> > Codeforces Round 596 题解

Codeforces Round 596 题解

作者:互联网

万幸的是终于碰上了一场上分好场。

不幸的是一开始差点不会 A。

万幸的是想了个不那么稳的结论过了 pretest。

不幸的是罚时很高,而且慌得一比。

万幸的是然后半个小时内把 B 和 C 码了。

不幸的是然后就只能看着排名一点一点掉了。

万幸的是最后 A 没被叉掉。

不幸的是我居然没敢去叉人。

万幸的是我就是叉了 10 个人排名也不会上涨超过 5。

不幸的是我每掉一名都会少涨两三分。

万幸的是我没去打隔壁的 ZR。

不幸的是我发现这场 ZR 我一题不会,打了就会掉分……


2A

没仔细想,但是应该分类讨论一下 \(d_a=d_b\),\(d_a+1=d_b\) 和 \(d_a=9,d_b=1\) 就行了。

2B1 & 2B2

没仔细想,但是感觉双指针,动态维护不同数的个数(开个 map)就行了。

2C/1A

先枚举要用多少个数拼成 \(n\)。假设当前枚举的是 \(i\)。

那么等价于用恰好 \(i\) 个 \(2\) 的整数次幂拼成 \(n-pi\)。

有解当且仅当 \(bitcnt(n-pi)\le i\) 且 \(n-pi\ge i\)。其中 \(bitcnt\) 是二进制表示中 \(1\) 的个数。

我当时猜的结论是如果有解答案不会超过 \(10^6\)(能稳就稳)。

搬运下官方题解:

当 \(n-30p\ge 30\) 时(即 \(i=30\) 时满足第二个条件),那么因为 \(n-30p<2^{30}\),\(30\) 是一定合法的。否则对于 \(i\ge 30\),\(n-pi\ge i\) 都不可能成立。所以答案至多是 \(30\)。


代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=100010;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
int n,p;
inline int bitcnt(int x){
    int c=0;
    for(;x;x&=x-1) c++;
    return c;
}
int main(){
    n=read();p=read();
    FOR(i,1,1000000){
        if(n-p*i>=i && bitcnt(n-p*i)<=i){
            printf("%d\n",i);return 0;
        }
    }
    puts("-1");
}

标签:ch,596,题解,ll,Codeforces,万幸,bitcnt,不幸,define
来源: https://www.cnblogs.com/1000Suns/p/11746670.html