题意就是把n分成n个1,每次最多只能分成k-1个1,和另一个数,若另一个数等于k的话,只用一次操作
代码如下
#include<bits/stdc++.h>
using namespace std;
int t;
int n,k;
int f(int a,int b)
{
if(a%b) return a/b+1;
return a/b;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
if(n==1) cout<<0<<endl;
if(n<k)
else cout<<f(n-k,k-1)+1<<endl;
}
return 0;
}
题意就是若1的个数大于连续0的区间的个数就是yes,反之则no
代码如下
#include<bits/stdc++.h>
using namespace std;
const int N =2e5+10;
int t;
int n;
char a[N];
void unit()
{
cin>>t;
while(t--)
{
int c1=0,c2=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
if(a[1]=='1') c1++;
else c2++;
for(int i=2;i<=n;i++)
{
if(a[i]=='1') c1++;
if(a[i]=='0'&&a[i-1]!=a[i]) c2++;
}
if(c1>c2) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
unit();
return 0;
}
C. Increasing Sequence with Fixed OR
这题就是构造题,若n>1,最长序列长度等于n的二进制1的个数+1
具体构造看代码
代码如下
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N =100;
int t;
int n;
int cnt;
int a[N];
int qmi(int a,int k)
{
int res=1;
while(k)
{
if(k&1) res=res*a;
a=a*a;
k>>=1;
}
return res;
}
void unit()
{
cin>>t;
while(t--)
{
cin>>n;
if(n==1)
{
cout<<1<<endl;
continue;
}
int y=n;
int res=0;
vector<int> a;
while(n>0)
{
a.push_back(n%2);
if(n%2==1) res++;
n/=2;
}
int t=0;
for(int i=a.size()-2;i>=0;i--)
{
if(a[i]==1)
{
t=i;
break;
}
}
cout<<res+1<<endl;
cout<<qmi(2,t)<<" ";
for(int i=a.size()-2;i>=0;i--)
{
if(a[i]==1) cout<<y-qmi(2,i)<<" ";
}
cout<<y<<endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
unit();
return 0;
}