One Or Two

首先,看题目

7a2210012bfd497d8b50ffcdff73b567.jpg

0716d72a1a8e46d092ae45d35ea7cda9.jpg

题目意思就是说,在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");
	}
}

后来通过观察它给出的样例,我又有了新的发现

附样例

03af9a1a69294c468114fe003c715b34.jpg

每当数组中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!!

最后,此题告诉我,要透过现象看本质!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值