Codeforces Round #131 (Div. 2)------AB
非常郁闷,一大早起来看结果,本来以为这次rating应该能升到1600以上的,可惜结果很惨,B题由于一个小失误,导致被别人hack成功了。由于家庭原因,老妈不准熬夜做,做了39min把AB两道简单题做完就没做了,本来想AB应该全AC的,名次也不会差,但是被hack了。废话不多说了,简单的回顾一下AB两道题目。
题目链接http://codeforces.com/contest/214
A:直接枚举的,暂时也没什么好的数学方法,不过数据比较小,枚举依然很快。
#include <iostream> using namespace std; int n , m; int a , b , ans = 0; int main () { cin >> n >> m; a = 0; while (a*a <= n) { b = n-a*a; if (a+b*b == m) ans ++; a ++; } cout << ans << endl; return 0; }
B:题目的意思就是给出一堆数字,让你用这些数字组成可以被2,3,5整除的最大的数,被2,5整除的话末尾必为0,然后将所有的数字加起来求和得到,对3取余,然后找出最小的整数X,其中X满足所有位的数字都在给出数字的范围内,并且要预留一个0(这个我考虑到了,但后面还有个跟0相关的),由于有0的存在,所以不用担心X找不到。然而过了小数据的我以为没有问题了,其实依然存在问题,那就是如果我去除了很多数字后,剩下了N个0,但是我的输出是0000000...(N个),而正确的输出应该是0,所以我直接就跪了T_T,果然当时应该检查一遍再lock睡觉的。
#include <iostream> #include <cstring> #define MAXN 100002 #define MAX 2147483647 using namespace std; int N; int sum = 0; bool flag = false; int h[10]; bool check(int sum) { int u[10]; memset(u,0,sizeof(u)); while (sum) { u[sum % 10] ++; sum /= 10; } if (u[0] >= h[0]) return false; for (int i = 1;i <= 9;i++) if (u[i] > h[i]) return false; return true; } void calc(int sum) { while (sum) { h[sum % 10] --; sum /= 10; } } bool ok() { int i; for (int i = 1;i <= 9;i++) if (h[i]) return true; return false; } int main () { int t; memset(h,0,sizeof(h)); cin >> N; for (int i = 0;i < N;i++) cin >> t , h[t] ++ , sum += t; if (!h[0]) cout << -1 << endl; else { t = sum % 3; if (sum) { for (;!check(t) && t < MAX;t += 3); calc(t); } if (ok()) for (int i = 9;i >= 0;i--) for (int j = 0;j < h[i];j++) cout << i; else cout << 0; cout << endl; } return 0; }
代码有点小丑。
测试结果:
结果反正不行,难得我睡觉前还想了下,应该没有问题。