hihoCoder挑战赛14
第一次在网上参加这种比赛,也是被虐的很惨了...
前两题竟然都有快200人过真是厉害,第一题都没做出来,第二题完全没有思路...
http://hihocoder.com/contest/challenge14/problems
先看第一题:
想复杂了啊,想了半天想到了桶排,x > 1就把1到1000的位置都加一,最后统计最大的值,然后就错错错...
然后发现没考虑浮点数,浮点数就没有下标这一说法了,然后就贵倒在地上...
最后结束后看别人代码才发现根本不用这样,只需要每次枚举0-1000的浮点数然后符合一条就加一,每次枚举的最后取最大的值;
然后考虑到浮点数的话,for循环1到1000就每次不加1,加0.5,虽然至今不懂这是为什么?还有输入整数的时候输了浮点数会是什么样的?
刚刚研究了一番终于懂了,输入的c一定是整数,但是x不一定是整数,所以x > 1 和x < 2可以同时成立,所以枚举x的时候每次加0.5就是考虑到这种情况;
而为什么是加0.5不是0.1则是因为:
因为0.5可以被准确的存储,用0.1主要会跪在"="的判断,可以看看浮点数标准
最后贴上别人的比较短的ac代码:
1 #include <bits/stdc++.h> 2 #define RD(x) scanf("%d", &x) 3 #define REP(i, n) for (int i=0; i<int(n); ++i) 4 #define FOR(i, n) for (int i=1; i<=int(n); ++i); 5 6 using namespace std; 7 8 #define N 123456 9 10 int c[N], kind[N]; 11 int n; 12 13 int Main() { 14 15 ios_base::sync_with_stdio(0); 16 17 cin >> n; 18 int mx = 1100, mn = -10; 19 20 REP(i, n) { 21 string s; 22 cin >> s; 23 cin >> s; 24 cin >> c[i]; 25 26 if (s == "<") 27 kind[i] = 0; 28 else if (s == "<=") 29 kind[i] = 1; 30 else if (s == "=") 31 kind[i] = 2; 32 else if (s == ">") 33 kind[i] = 3; 34 else 35 kind[i] = 4; 36 mx = max(mx, c[i] + 10); 37 mn = min(mn, c[i] - 10); 38 } 39 40 int ans = 0; 41 for (double x = mn; x <= mx; x += 0.5) { 42 int tmp = 0; 43 REP(i, n) { 44 if (kind[i] == 0 && x < c[i]) 45 tmp++; 46 47 if (kind[i] == 1 && x <= c[i]) 48 tmp++; 49 50 if (kind[i] == 2 && x == c[i]) 51 tmp++; 52 53 if (kind[i] == 3 && x > c[i]) 54 tmp++; 55 56 if (kind[i] == 4 && x >= c[i]) 57 tmp++; 58 } 59 ans = max(ans, tmp); 60 } 61 62 cout << ans << endl; 63 64 return 0; 65 } 66 67 int main() { 68 return Main(); 69 }
自己的写错了就不贴了...