26建华暑期集训 CSP-J 模拟赛(8/7)

题号 题目 测评结果 代码问题 错因 需改进
A 阅读书籍 WA 你的代码写成max(其余总和,最大值)2;等价max(其余2,max2),不等于max(sum,2max)。当 sum>2*max 时会错。 贪心公式写错 多检查(改了一行就AC)
B 自习室 TLE 暴力 O (Q・N);打乱题目给定有序 L;条件写错 复杂度爆炸 + 读题漏条件 多换几个思路,多想几种方法
C 棋盘落子 RE 开 1000×1000 小数组,越界 RE;暴力循环清空行列,时间爆炸 空间、时间暴力,不会转化模拟
D 公告墙 WA 骗分 投机,没写正解😓 增加知识面

第一题:

#include<bits/stdc++.h>
using namespace std;
long long t[200001], ans=0;
long long cnt1, cnt2; 
int main(){
    freopen("books.in","r",stdin);
    freopen("books.out","w",stdout);
    long long n;
    cin>>n;
    for(long long i=0;i<n;i++) cin>>t[i];
    sort(t, t+n);
    cnt2=t[n-1];
    for(long long i=0;i<n-1;i++){
        cnt1+=t[i];
    }
    long long total=cnt1+cnt2;
    ans=max(total, cnt2*2);
    cout<<ans;
    
    return 0;
}

第二题:

#include<bits/stdc++.h>
using namespace std;
struct stu{
    long long h, l;
}t[300001];
long long maxh[300001];
long long L[300001];
long long x;
long long f(long long n, long long T){//找第一个 L[i] > T 的下标
    long long left=0, right=n;
    while(left<right){
        long long mid=(left+right)/2;
        if(L[mid]>T) right=mid;
        else left=mid+1;
    }
    return left;
}
int main(){
    freopen("study.in","r",stdin);
    freopen("study.out","w",stdout);
    ios::sync_with_stdio(false);
    long long n, m;
    cin>>n;
    for(long long i=0;i<n;i++){
        cin>>t[i].h>>t[i].l;
        L[i] = t[i].l;
    }
    maxh[n]=0;//预处理后缀最大值
    for(long long i=n-1;i>=0;i--) maxh[i]=max(t[i].h, maxh[i+1]);
    cin>>m;
    for(long long i=0;i<m;i++){
        cin>>x;
        long long pos=f(n, x);
        cout<<maxh[pos]<<'\n';
    }

    return 0;
}

三四题没改对😓