读题&调试
读题
阅读理解题意,关注数据范围和子任务,考虑使用的算法,计算时复要求是否合规,极端情况是否会出错
- 空复计算:int = 4B,1000大小 = 4 * 1000 = 4KB,256MB = 256000000B
一维数组64000000
二维数组8000 * 8000
- 时复计算:吃经验
造样例(重点):造一些极端样例看是否可以通过
调试Debug
调试:小黄鸭调试(静态查错),输出中间变量
检查:数组大小,是否有不必要的输出未注释掉,检查数据范围是否爆int(要开long long)
样例与对拍
- 极限数据:如人数为上限10^6,分数每个人都为0/600(分数的上下限)
对拍
生成数据文件
rand();在window下数据较小为32767,想更大则要去linux测试或者多次生成来变成更大的数
#include <bits/stdc++.h>
using namespace std;
int main() {
srand(time(0));//初始随机
int n = 100;
freopen("live.in", "w", stdout);//生成随机数据文件
int w = rand() % 101;
cout << n << ' ' << w << endl;
for(int i = 1; i <= n; ++ i) {
int a = rand() % 601;
cout << a << ' ';
}
}
使用xxx.bat文件
不停的跑,当比较出错的时候即停止,此时去对应的live.in即可
:loop
CodeForce.exe//依次执行.exe文件
vjudge.exe
Cpp.exe
fc live.out live.ans //比较两文件
if not errorlevel 1 goto loop //回到开头继续循环
brute
#include <bits/stdc++.h>
using namespace std;
int n, w, a[100010];
bool cmp(int a, int b) {
return a > b;
}
int main() {
freopen("live.in", "r", stdin);//读入live.in
freopen("live.ans", "w", stdout);//将结果记录到live.ans
cin >> n >> w;
for(int i = 1; i <= n; ++ i) {
cin >> a[i];
sort(a + 1, a + n + 1, cmp);
cout << a[max(1, 1 * w / 100)];
if(i < n) cout << ' ';
}
return 0;
}
正解
#include <bits/stdc++.h>
using namespace std;
int num[610] = {0};
int n, w, a;
int main() {
freopen("live.in", "r", stdin);
freopen("live.out", "w", stdout);
cin >> n >> w;
for(int i = 1; i <= n; ++ i) {
cin >> a;
num[a] ++;
int k = i * w / 100;
if(!k) ++ k;
int sum = 0, j;
for(j = 600; j >= 0; -- j) {
sum += num[j];
if(sum >= k) break;
}
cout << j;
if(i < n) cout << ' ';
}
return 0;
}