UVa-11292
来源:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2267
第一题在UVa上AC的题。
题本身简单,但是UVa的数据很凶残。
提交了20来次,终于发现了点东西。
首先,UVa肯定是用了linux的系统评测,因为数组初始化了和没初始化是完全不同的,在windows下这问题不大。
再有,边界条件不是一般的严格,数组最好从0开始存储,不然莫名其妙的就错了。
这是我AC的代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[20010],b[20010]; int main() { int n,m; while (scanf("%d%d",&n,&m)==2 && n && m) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for (int i=1;i<=n;i++) scanf("%d",&a[i]); //我的数组是从1开始存储的,出现了很多莫名其妙的问题 for (int i=1;i<=m;i++) scanf("%d",&b[i]); sort(a+1,a+n+1); sort(b+1,b+m+1); int k=1,sum=0; //注意k是从1开始的,从0开始就死定了,基本上没法改 for (int i=1;i<=m;i++) { if (b[i]>=a[k]){ sum+=b[i]; if (++k==n+1) break; //这里的判断也是一样 } } if (k<=n) printf("Loowater is doomed!\n"); else printf("%d\n",sum); } return 0; }
这个是数组从0开始存储的:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[20010],b[20010]; int main() { int n,m; while (scanf("%d%d",&n,&m)==2 && n && m) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for (int i=0;i<n;i++) scanf("%d",&a[i]); //从0开始存储 for (int i=0;i<m;i++) scanf("%d",&b[i]); sort(a,a+n); sort(b,b+m); int k=0,sum=0; //注意k的值 for (int i=0;i<m;i++) { if (b[i]>=a[k]){ sum+=b[i]; if (++k==n) break; //注意条件 } } if (k<n) printf("Loowater is doomed!\n"); else printf("%d\n",sum); } return 0; }