您的位置:首页 > 其它

CSU 1536 bit string reordering

2015-11-02 20:31 295 查看
首先构造出两个满足条件的字符串储存在s1,s2,原串储存在s。

比较s1串s2串中‘1’的个数是否和s串中的‘1’的个数相等。若相等,则统计转换的次数。

统计转换次数的方法看compare函数。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
char s1[20],s2[20],s[20];
char c[20],c1[20];
int n,m;
int a[20];
int t1,t2;
int tt1,tt2,tt3;
void build(int k,int d)
{
for(int i=0;i<k;i++)
{
if(d%2==0)
{
s1[t1++]='1';
tt2++;
}
else
s1[t1++]='0';
}
for(int i=0;i<k;i++)
{
if(d%2==0)
{
s2[t2++]='0';
}
else
{
s2[t2++]='1';
tt3++;
}
}
}
int compare(char c[],char c1[])
{
int sum=0;
int ans=0;
for(int i=0;i<n;i++)
{
sum+=abs(ans);
if(c[i]=='1')
ans++;
if(c1[i]=='1')
ans--;
}
return sum;
}
int solve()
{
int ans=1<<29;
if(tt1==tt2)
ans=compare(s,s1);
if(tt1==tt3)
ans=min(compare(s,s2),ans);
return ans;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
tt1=tt2=tt3=0;
t1=t2=0;
for(int i=0;i<n;i++)
{
getchar();
scanf("%c",&s[i]);
if(s[i]=='1') tt1++;
}
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
for(int i=0;i<m;i++)
{
build(a[i],i);
}
cout<<solve()<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: