NYOJ 915 +-字符串
2014-07-09 17:11
218 查看
+-字符串
时间限制:1000 ms| 内存限制:65535 KB
难度:1
描述
Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。
输入
多组测试数据
每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。
输出
仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。
样例输入
++-+--+
-++--++
样例输出
4
第一种解法:根据加号之间的差距和
#include<stdio.h>
int ab(int ma,int mb)
{
int x;
x=ma-mb;
if(x<0)
x=-x;
return x;
}
int main()
{
char a[6000], b[6000];
int x,y,sum,c[6000],d[6000],k;
while(~scanf("%s%s",a,b))
{
k=x=y=sum=0;
for(int i=0;a[i]!='\0';i++)
if(a[i]=='+'){x++;c[k++]=i;}
k=0;
for(int i=0;b[i]!='\0';i++)
if(b[i]=='+'){y++;d[k++]=i;}
if(x!=y)
printf("-1\n");
else
{
for(int i=0;i<k;i++)
sum+=ab(c[i],d[i]);
printf("%d\n",sum);
}
}
}
第一种解法:该算法对贪心的体现不是太明显,两个for循环稍微体现
#include <stdio.h>
#include <string.h>
int main()
{
char a[5001];
char b[5001];
int i,j,m1,m2;
int count;
int len;
while(scanf("%s%s",a,b)!=EOF)
{
m1=m2=0;
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]=='+')
m1++;
if(b[i]=='+')
m2++;
}
if(m1!=m2)
{
printf("-1\n");
continue;
}
count=0;
for(i=0;i<len;i++)
{
if(a[i]!=b[i])
{
for(j=i+1;j<len;j++).控制j的值
if(a[j]==b[i])
break;
count+=j-i;
a[j]=a[i];
}
}
printf("%d\n",count);
}
}
相关文章推荐
- nyoj 915 +-字符串【字符串】
- NYOJ 915 +-字符串
- nyoj 915 +-字符串
- NYOJ 915 +-字符串
- nyoj 915 +-字符串
- nyoj915*+-字符串
- NYOJ 915 +-字符串
- nyoj-915-+-字符串
- NYOJ-915 +-字符串
- nyoj915 +-字符串
- NYOJ 915 +-字符串
- nyoj 915 +-字符串
- nyoj 915 +-字符串 贪心
- nyoj 915 +-字符串(贪心)
- nyoj-915-+-字符串
- nyoj 915 +-字符串
- nyoj-915-+-字符串
- NYOJ 题目915+-字符串(字符串,水题)
- nyoj 915 +-字符串(贪心)
- nyoj_915_+-字符串_201402261520