社区讨论

诡异现象求助

学术版参与者 5已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mj1h30wu
此快照首次捕获于
2025/12/11 21:27
2 个月前
此快照最后确认于
2025/12/13 20:50
2 个月前
查看原帖
这份代码在样例中正确处理了所有输入数据并给出了正确输出结果,但在所有输出结束后忽然 RE 并异常退出了。
CPP
#include <bits/stdc++.h>
#define T 310
#define N 30
#define INF 1000000000
using namespace std;
int _, n, dp[T][N][N], sol[T][N][N];
struct node {
	char id;
	int t, d;
//	bool operator <(const node &tmp) const &{
//		if(t == tmp.t) return d < tmp.d;
//		return t < tmp.t;
//	}
} a[N];
char itoc(int x) {return x | 64;}
int main() {
	cin >> _;
	while(_--) {
		cin >> n;
		for(int i = 1; i <= n; i++) {
			cin >> a[i].t >> a[i].d;
			a[i].id = itoc(i);
		}
		for(int i = 0; i <= n; i++)
			for(int j = 1; j <= n; j++) dp[0][i][j] = sol[0][i][j] = INF;
		for(int i = 1; i <= T - 10; i++)
			for(int j = 0; j <= n; j++)
				for(int k = 0; k <= n; k++) {
					sol[i][j][k] = INF;
					if(!j && !k) {dp[i][j][k] = 0; sol[i][j][k] = 0; continue;}
					dp[i][j][k] = INF;
					if(j && dp[i][j - 1][k] < dp[i][j][k]) {
//						if(i == 0 && j == 1 && k == 1) cout << "in1\n";
						dp[i][j][k] = dp[i][j - 1][k];
						sol[i][j][k] = 0;
					}
					if(i >= a[j].t && j && k && dp[i - a[j].t][j - 1][k - 1] + 20 * a[j].d + i < dp[i][j][k]) {
//						if(i == 0 && j == 1 && k == 1) cout << "in2\n";
						dp[i][j][k] = dp[i - a[j].t][j - 1][k - 1] + 20 * a[j].d + i;
						sol[i][j][k] = 1;
					}
				}
//		cout << dp[0][1][1] << '\n' << '\n';
		int ansvis1 = 0, ansvis3 = 0;
		for(int i = 1; i <= T - 10; i++) {
			int tmp = n;
			while(dp[i][n][tmp] == INF) tmp--;
			if(tmp > ansvis3) {ansvis1 = i; ansvis3 = tmp;}
		}
		cout << /*ansvis1 << ' ' << */ansvis3 << ' ' << dp[ansvis1][n][ansvis3] << '\n';
		string ansstr = " ";
		for(int i = 1; i <= T - 10; i++) ansstr += '-';
		int nowi = ansvis1, nowj = n, nowk = ansvis3;
		while(nowi >= 0 && nowj >= 0 && nowk >= 0 && sol[nowi][nowj][nowk] != INF)
			if(sol[nowi][nowj][nowk]) {
				int tmp = nowj;
				for(int i = nowi; i >= a[tmp].t - nowi + 1; i--) ansstr[i] = a[tmp].id;
				nowi = nowi - a[tmp].t; nowj--; nowk--;
			} else {
				nowj--;
			}
		for(int i = 1; i <= T - 10; i++) {
			cout << ansstr[i];
			if(!(i % 30)) cout << '\n';
		}
	}
	return 0;
}
并且加上 ios::sync_with_stdio(0); 一句后最后一组数据没有输出就直接 RE,再加上 cin.tie(0); 后最后一组数据会输出到字符串 - 之前的内容后 RE。
这也太诡异了,遂求助。问 AI 无果。

回复

8 条回复,欢迎继续交流。

正在加载回复...