HDU 4379 The More The Better [坑爹想法题]

这题各种卡.

先是卡空间, n太大了, 想要都存下来再sort只能是MLE.

因为开不下, 所以逼你写空间复杂度O(1)的算法, Online扫一遍. O(n)的时间复杂度.

算法是, 小于等于 L/2 的都可以加进来, 而大于L/2的可能可以加入一个, 只要min(大于L/2的)+max(小于等于L/2)  小于等于L就行了.

完全不懂这题为什么用序列来描述而不用集合...这跟序根本没关系么...还有那个公式让人觉得是数论题...没想到是乱搞题...

再是卡时间. 过的一般都是1500ms+....写挫了还不敢保证不TLE...

另外 , 这题又提醒我杭电的int64输入输出是多么坑爹, TLE了不知道多少次是因为语言跟输入输出...

哦, 对了还有, WA了N次...因为你最后把min跟max加起来的时候, 要判断是不是真的存在min...也就是说, 不要落了所有数都可以选进去的情况. 我看题解发现这个大家都没考虑, 因为min初始化比1e9大, 所有就必然小于L了.

但是其实这题没必要用int64的...就是在算 A*i+B的时候考虑下溢出就是了.

先给个不用int64输入输出, 然后G++/C++都能A的代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
inline int Rint() { int x; scanf("%d", &x); return x; }
inline int max(int x, int y) { return (x>y)? x: y; }
inline int min(int x, int y) { return (x<y)? x: y; }
#define FOR(i, a, b) for(int i=(a); i<=(b); i++)
#define FORD(i,a,b) for(int i=(a);i>=(b);i--)
#define REP(x) for(int i=0; i<(x); i++)
//typedef long long int64;
typedef __int64 int64;
#define INF (1<<30)
const double eps = 1e-8;
#define bug(s) cout<<#s<<"="<<s<<" "

int main()
{
	int n, l, mod;
	int A, b;
	while(~scanf("%d%d%d%d%d", &n, &l, &A, &b, &mod))
	{
		int maxx = 0;
		int minx = INF;
		int havemin=0;

		int cnt=0;
		int mid = l/2;

		for(int i=1; i<=n; i++)
		{
			int x = ((int64)A*i+b)%mod;
			if(x<=mid)
			{
				cnt++;
				maxx = max(maxx, x);
			}
			else
			{
				if(minx>x) minx=x, havemin=1;
			}
		}
		if(havemin && maxx+minx <= l) cnt++;

		printf("%d\n", cnt);
	}
}

还有我发现, 我用int64输入输入然后用G++, 怎么都是TLE.....完全搞不懂杭电的G++要怎么搞....

总结下, 以后要在杭电做int64输入输出的题目, 就用C++交, 然后int64都用 __int64, 输入输出都用 I64d .....

这样应该不会有问题了.....


你可能感兴趣的:(HDU 4379 The More The Better [坑爹想法题])