您的位置:首页 > 其它

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

2012-08-18 20:45 381 查看
这题各种卡.

先是卡空间, 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 .....

这样应该不会有问题了.....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 语言 c