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 补题报告2024年8月5日−2023年8月5日by 邓时飏
一、做题情况
-
第一题比赛 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;
}
四、赛后总结
提升实力,控制时间。