CSP - S 2024 模拟赛6补题报告

C S P   −   S    2024   模拟赛 6   补题报告 2024 年 8 月 5 日 − 2023 年 8 月 5 日 b y    邓时飏 CSP \ - \ S \ \ 2024 \ \ 模拟赛6 \ \ 补题报告 \\ 2024年8月5日 - 2023年8月5日 \\ by \ \ \ 邓时飏 CSP  S  2024  模拟赛6  补题报告202485202385by   邓时飏

一、做题情况

  • 第一题比赛 100 100 100 / 100 100 100 ,赛后通过

  • 第二题比赛 10 10 10 / 100 100 100 ,赛后通过

  • 第三题比赛 10 10 10 / 100 100 100 ,赛后通过

  • 第四题比赛 20 20 20 / 100 100 100 ,赛后通过

  • 比赛得分 140 140 140 / 400 400 400 ,赛后补题 340 340 340 / 400 400 400

二、题解报告

T1:

题面:

在这里插入图片描述
在这里插入图片描述

做法:

统计剩下的数字,在从小到大的插入就行

附:AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int n,m,a[maxn],p[maxn],f[maxn],j = 1,k = 1,w,h,e = 1;
int main(){
	freopen("seq.in","r",stdin);
	freopen("seq.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= m; i++){
		scanf("%d",&a[i]);
		p[a[i]] = 1;
	}
	for(int i = 1; i <= n; i++){
		if(p[i] != 1){
			f[j] = i;
			j++;
		}
	}
	for(int i = 1; i <= n; i++){
		if(w == m){
			printf("%d\n",f[k]);
			k++;
		}
		else if(h == n-m){
			printf("%d\n",a[e]);
			e++;
		}
		else if(f[k] < a[e]){
			printf("%d\n",f[k]);
			k++;
			h++;
		}else {
			printf("%d\n",a[e]);
			e++;
			w++;
		}
	}
	return 0;
}

T2:

题面:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

做法:

我们可以通过遍历括号序列来计算当前序列的深度,并记录需要修改的括号对数量来降低深度,使其不超过 L

附:AC代码
#include<bits/stdc++.h>
#define for1(i,a,b) for( int i=(a);i<=(b);i++)
using namespace std;
int n,l,dep,tot;
char a[1000005];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    freopen("bracket.in","r",stdin);
    freopen("bracket.out","w",stdout);
    cin>>n>>l;
    for1(i,1,n) cin>>a[i];
    for1(i,1,n){
        if(a[i]=='(') dep++;
        else dep--;
        if(dep<0){
            tot++;
            dep+=2;
        }else if(dep>l){
            tot++;
            dep-=2;
        }
    }
    cout<<tot;
    return 0;
}

T3:

题面:

在这里插入图片描述
在这里插入图片描述

做法:

我们可以使用一个优先队列(最小堆)来实现这个贪心选择过程。在每次选择任务时,将最小的基础时间任务拿出来,并计算其完成所需的总时间。如果总时间不超过 T,则完成该任务并更新剩余时间和已完成任务数量。

附:AC代码
#include<bits/stdc++.h>
#define MAXN 100010
using namespace std;
typedef long long ll;
ll n,tt;
struct rw{
    ll t,p;
}a[MAXN];
ll f[MAXN];
bool cmp(rw a,rw b){return a.p>b.p;}
int main(){
    freopen("work.in","r",stdin);
    freopen("work.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);    
    memset(f,0x3f,sizeof f);
    cin >> n>> tt;
    for(int i=1;i<=n;i++) cin >> a[i].t;
    for(int i=1;i<=n;i++) cin >> a[i].p;
    sort(a+1,a+n+1,cmp);
    f[0]=0;
    for(int i=1;i<=n;i++){
        for(int j=24;j>=1;j--){
            f[j]=min(f[j],f[j-1]+a[i].t+(j-1)*a[i].p);
        }
    }
    for(int i=1;i<=n;i++){
        if(f[i]>tt){
            cout << i-1;
            return 0;
        }
    }
    cout << n;
    return 0;
}

T4:

题面:

在这里插入图片描述
在这里插入图片描述

做法:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

附:AC代码
#include<bits/stdc++.h>

typedef std::pair<int,int> pii;
const int MAXN = 200011;

int deg[MAXN],cross[MAXN];
bool del[MAXN],tag[MAXN];
std::vector<int>g[MAXN],sp;
std::set<pii>S;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        g[u].emplace_back(v),g[v].emplace_back(u);
        ++deg[u],++deg[v];
    }
    for(int i=1;i<=n;++i)S.insert(pii(deg[i],i));
    while(S.size()&&S.begin()->first!=(--S.end())->first)
    {
        int u=S.begin()->second;
        //printf("get %d\n",u);
        S.erase(S.begin());
        del[u]=1;
        for(auto v:g[u])
        {
            if(del[v])continue;
            S.erase(pii(deg[v],v));
            --deg[v];
            S.insert(pii(deg[v],v));
        }
    }
    for(auto P:S)sp.emplace_back(P.second);
    // printf("SP:");
    // for(auto x:sp)printf("%d ",x);
    // puts("");
    int x=sp[0];
    if(deg[x]+1!=sp.size())
    {
        puts("0");return 0;
    }
    int ans=0,err=0,sc=0;
    for(int u=1;u<=n;++u)
        for(auto v:g[u])
            if(del[u]&&del[v])++err;
            else if(!del[u]&&del[v])++cross[u],++sc;
    err>>=1;
    if(err==0)++ans;
    for(int u=1;u<=n;++u)
        if(del[u])
        {
            //printf("u=%d\n",u);
            int c=0,ex=0,cc=0;
            for(auto v:g[u])
                if(!del[v])++c,tag[v]=1,cc+=cross[v];
                else ++ex;
            //printf("c=%d,ex=%d\n",c,ex);
            if(c==sp.size()&&err==ex)++ans;
            else if(c+1==sp.size()&&err==ex&&cc==sc)++ans;
        }
    for(auto x:sp)
        if(!cross[x]&&!err)++ans;
    printf("%d\n",ans);
    return 0;
}

四、赛后总结

提升实力,控制时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值