Codeforces Round 958 (Div. 2)—补题

A. Split the Multiset

很简单的一道题,每次按最高的k给它加上,然后减1就行了

void solve(){
	cin>>n>>k;
	int sum=1,ans=0;
	while(sum<n){
		sum+=k-1;ans++;
	}
	cout<<ans<<endl;
}

B. Make Majority

把两个以上连续的0直接变成一个,最后再统计1和0的数量进行判断

void solve(){
	string s;
	cin>>n>>s;
	int tt=0,sum=0;
	for(int i=0;i<s.size();++i){
		int j=i;
		while(s[j]=='0'){
			j++;
		}
		if(j>i) i=j-1,a[++tt]=0;
		if(s[i]=='1') a[++tt]=1;
	}
	for(int i=1;i<=tt;++i){
		if(a[i]==1) sum++;
	}
	if(sum*2>tt) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
}

C. Increasing Sequence with Fixed OR

构造题,每一次验算把一个位置的1换成0后的结果能不能符合条件

void solve(){
	cin>>n;vector<ll> a;
	for(ll i=62;i>=-1;i--){
		long long x=1ll<<i;
		if((x&n)==x&&x!=n&&n-x>=0){
			a.push_back(n-x);
		}
	}a.push_back(n);
	cout<<a.size()<<endl;
	for(ll u:a) cout<<u<<" ";cout<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值