2021.01.14【NOIP提高B组】模拟

就是这么一回事,感觉题目难度中上,不是完全不可做,但是自己没拿到分……
问题主要出在这几个地方:

  1. T1换行没加,然后就0分了,加上去AC
  2. T2没有水到一点分(可能不太好水),但是下次还是要试一试的。
  3. T4下次尽可能想DP式子&方法。
    要知道就算是110在初一&初二的一群DALAO之中也可以排到RANK21

先来看看T1,突然发现我的数学方法比暴力要慢的多。
听了ZWJ的讲解后,突然发现我要做三次操作其实暴力只用做一次操作。换句话说,知道子数据的组数 T T T足够多,那么数学方法将会被hack出TLE。

所以来重新审视一下暴力算法,再来看一下数学的算法:
你会发现,数学的算法是 O ( t l o g ( n ) ) O(tlog(n)) O(tlog(n)),然而暴力的路径是始终小于 l o g log log的,很神奇……

然后,出一个可以hack掉自己的数据
2 6 10
答案其实是2,但是如果按照自己那样算的话,会没掉。
所以,我们再考虑一下就好了问题就好了,如果出现了三个都不是4的倍数的话,这个数据就要重新考虑。但是如何重新,难道是暴力吗?
知道出题人够恶心来个捆绑啥的,一个全都不是4的倍数的数据,就没了。

所以我们要假设出题人足够恶心,所以我们假设一个解决的办法,如果出现了这样的情况,就+1.

然后,过了hack数据,然后也AC了。
欢迎大家来出数据卡我……

并没有改的代码

#include
using namespace std;
int t;
long long a,b,c;
int x,y,z;
int min(int p,int q){if(p>q) return q;return p;}
int ftwo(long long p)
{
	int k=0;
	while(p%2==0&&p>0) p/=2,k++;
	return k;
}
int main()
{
	freopen("carry.in","r",stdin);
	freopen("carry.out","w",stdout);
	scanf("%d",&t);
	for(int i=1;i<=t;++i)
	{
		scanf("%lld%lld%lld",&a,&b,&c);
		if(a%2==1||b%2==1||c%2==1){printf("0\n");continue;}
		if(a==b&&b==c){printf("-1\n");continue;}
		x=ftwo(a),y=ftwo(b),z=ftwo(c);
		printf("%d\n",min(x,min(y,z)));
	}return 0;
}

你可能感兴趣的:(总结)