首先,看题目
题目意思就是说,在1~n项里,可能会存在有第k个会使它前面部分的各个数(包括它本身)相乘等于它后面部分的各个数相乘。注意,这里的k是最小的!!!
我最开始的想法呢,就是从1开始一个一个往后边判断嘛,于是又写出了我的暴力算法...
emm...怎么说,虽然过了几个测试点,但是这必超时...
如果题目跟我想的一样简单就好了(っ╥╯﹏╰╥c)
OK,也贴出来,作为反面教材
错误代码如下
#include<stdio.h>
#define N 1010
int other(int t,int z,int b[])
{
int sum=1;
for(int i=t+1;i<=z;i++)
sum=sum*b[i];//后半部分相乘
return sum;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int t,a[N],i,k=0,sum=1;
scanf("%d",&t);
for(i=1;i<=t;i++)
scanf("%d",&a[i]);
for(i=1;i<=t-1;i++)
{
sum=sum*a[i];//前半部分相乘
if(sum==other(i,t,a))
{
k=i;//找到相同点时,记录下标后跳出for循环
break;
}
}
if(k!=0)
printf("%d\n",k);
else
printf("-1\n");
}
}
后来通过观察它给出的样例,我又有了新的发现
附样例
每当数组中2的个数为偶数时,它必可被分为两个相等的部分,在此可暂时忽略一下1的存在,
例如说,2 1 2 2 2,忽略1之后,可看成2 2 2 2,在这里边分成两个相等的部分还不好分嘛?分界线就在第二个2的后边——2 2 | 2 2
当数组中2存在的个数为奇数时,是不可分的,直接输出 -1 就好了。
此外,题目中的 数组只能是1或2 这应该也是在暗示了我们些什么了。还是大意了...
代码如下
#include<stdio.h>
int main()
{
int t,n,a[1000];
scanf("%d",&t);
while(t--)
{
int cnt=0,d,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]==2)
cnt++;//数2的个数
}
if(cnt%2!=0)//当2的个数为奇数时,直接输出-1
printf("-1\n");
else
{
int sum=0;
for(i=0;i<n;i++)
{
if(a[i]==2)
sum++;
if(sum==cnt)//将2的个数分成两半,如2 2 2 2,分界点在第二个2后面
{
printf("%d\n",i+1);
break;
}
}
}
}
return 0;
}
特别提醒一下自己,那个scanf里边的 & 别每次到输入数组的时候就忘,都已经找了好几次bug了。o(*≧д≦)o!!
最后,此题告诉我,要透过现象看本质!