Codeforces1204A
注意二进制数范围 0=<s
可以为0 len=1 ‘0’
不能超过2进制数本身的 1 4 16 64错过 问错过多少
隔两个计数 不能以0开头
最后根据1的个数 特判 注意长度为1的情况 ‘1’ ‘0’都为0
string s;
ll a[maxn],b[maxn],vis[maxn];
int main(){
cin>>s;
int len=s.size();
if(s[0]=='0')
return cout<<0<<endl,0;
for(int i=0;i<len;i++){
if(s[i]=='1')
f++;
}
for(int i=len-1;i>=0;i-=2){
cnt++;
}
if(f==1 && len&1) //只有1个1 首为1 奇数9 0-8 肯定能到首 100000000
cnt--; //len=1 '1'
cout<<cnt<<endl;
return 0;
}
string s;
ll a[maxn],b[maxn],vis[maxn];
int main(){
cin>>s;
int len=s.size();
if(len==1 && s[0]=='0')
return cout<<0<<endl,0;
if(len==1 && s[0]=='1')
return cout<<0<<endl,0;
for(int i=len-1;i>=0;i--){
if(s[i]=='1'){
vis[i]=1;
pos=i;
}
else if(vis[i+1]!=0){
vis[i]=1; //前面必有1 本位为0 说明后面有1
}
}
vis[len]=1;
// for(int i=0;i<=len;i++)
// cout<<vis[i]<<" ";
// cout<<endl;
for(int i=len-1;i>=0;i-=2){
if(s[i]=='1' && (vis[i+1]!=0 || vis[i-1]!=0)) //前面/后面有1 比如10100 vis 111001
cnt++;
else if(s[i]=='1' && vis[i+1]==0)
continue;
else if(s[i]=='0')
cnt++;
}
cout<<cnt<<endl;
return 0;
}
B 简单构造
n个数 种类在l-r范围内 ai=1或者ai为偶数且ai/2在数组中
求和最小值 最大值
ai 种类只能取 1 2 4 8 16
n=4 l=2 r=2
1 1 1 2
1 2 2 2
ll a[maxn],b[maxn],vis[maxn],sum1,sum2;
//int num[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,*,*};//2^19=
int main(){
cin>>n>>l>>r;
cnt=1;
for(int i=1;i<=n-l;i++){
a[i]=1;
}
for(int i=n-l+1;i<=n;i++){
a[i]=cnt;
cnt<<=1;
}
cnt=1;
for(int i=1;i<=r;i++){
b[i]=cnt;
cnt<<=1;
}
for(int i=r+1;i<=n;i++){
b[i]=cnt/2;
}
for(int i=1;i<=n;i++){
sum1+=a[i];
sum2+=b[i];
}
cout<<sum1<<" "<<sum2<<endl;
return 0;
}
C
floyd算法 单源最短路
任意两点之间的最短路
const int maxn=105;
const int maxm=1e6+5;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
string s,t;
char c[maxn][maxn];
int p[maxm],d[maxn][maxn];
vector<int> ans;//1e6
int n,m;
void floyd(int n){
rep(k,1,n){
rep(i,1,n){
rep(j,1,n)
if(d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j]; //单源最短路
}
}
}
int main(){
cin>>n;
rep(i,1,n){
rep(j,1,n){
cin>>c[i][j];
if(c[i][j]=='0')
d[i][j]= (i==j ? 0 :INF);
else
d[i][j]=1;
}
}
rep(k,1,n){
rep(i,1,n){
rep(j,1,n)
if(d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j]; //单源最短路
}
}
// rep(i,1,n){
// rep(j,1,n){
// cout<<d[i][j];
// }
// cout<<endl;
// }
cin>>m;
rep(i,1,m)
cin>>p[i];
int s=0;
for(int i=1,j;i<=m;i=j){
ans.pb(p[i]);
s=0; //上一次
for(j=i;j<=m;j++){
if(s+d[p[j]][p[j+1]]!=d[p[i]][p[j+1]])
break;
s+=d[p[j]][p[j+1]];
}
}
cout<<ans.size()<<endl;
for(auto k:ans){
cout<<k<<' ';
}
cout<<endl;
return 0;
}
D1/D2
长度2000 1e5
string s;
int main(){
cin>>s;
for(int i=s.size()-1;i>=0;i--){
if(s[i]=='0')
cnt0++;
else if(s[i]=='1' && cnt1>=cnt0)
s[i]='0';
else
cnt1++;
}
cout<<s<<endl;
return 0;
}