蒟蒻求助
查看原帖
蒟蒻求助
1338385
ffr25楼主2024/8/6 17:01

求助大佬,看了最上面那篇题解,用了二分法,在写judge函数的时候忽然想到应该还要在judge里添加一个bool值来记录是否有两个石头间的距离为mid,结果TLE了,去掉这个bool值就ac了,为什么只要判断需要移开的石头数是否小于等于M就行了啊,就算小于,可能也没有两块石头间的距离刚好等于mid啊``` int L, N, M, al[50010], ans; //ac的judge bool judge(int mid) {//判断是否符合要求 int tem = 0, cnt = 0; for (int i = 0; i <= N + 1; i++) { for (int j = i + 1; j <= N + 1; j++) { if (al[j] - al[i] < mid)cnt++; else { i = j - 1; break; } } } return cnt <= M; } //tle的judge #if(0) bool judge(int mid) {
int tem = 0, cnt = 0; bool flag = false; for (int i = 0; i <= N + 1; i++) { for (int j = i + 1; j <= N + 1; j++) { if (al[j] - al[i] < mid)cnt++; else { if (al[j] - al[i] == mid)flag = true; i = j - 1; break; } } } return cnt <= M && flag; }

#endif int main() { cin >> L >> N >> M; al[0] = 0; for (int i = 1; i <= N; i++) { cin >> al[i]; } al[N + 1] = L; //终点位置 int l = 1, r = L + 10, mid = 0;
while (l < r) { //二分 mid = l + (r - l) / 2; if (judge(mid)) { ans = mid; l = mid + 1; } else r = mid; } cout << ans; return 0; }

2024/8/6 17:01
加载中...