OVSolitario-io

导航

读题&调试

读题

阅读理解题意,关注数据范围和子任务,考虑使用的算法,计算时复要求是否合规,极端情况是否会出错

  • 空复计算: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;
}

posted on 2025-08-25 08:50  TBeauty  阅读(3)  评论(0)    收藏  举报