首页 > 其他分享 >【训练记录】2024年莆田市高中信息学奥赛国庆集训CSP-S提高组(第四天场外)

【训练记录】2024年莆田市高中信息学奥赛国庆集训CSP-S提高组(第四天场外)

时间:2024-10-04 13:12:20浏览次数:1  
标签:int cin long 2024 solve 奥赛 操作 CSP dp

训练情况

rk#1

\(100 + 100 + 100 + 100 = 400\)

赛后反思

因为满分AK了,就不需要反思了

A题





显然我们想要选的最多,我们优先选 \(a_i\) 小的,所以我们对 \(a_i\) 从小到大排序,再求一个前缀和,再使用二分即可

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n,q; cin>>n>>q;
	vector<int> a(n + 1);
	vector<int> p(n + 1);
	for(int i = 1;i<=n;i++) cin>>a[i];
	sort(a.begin()+1,a.end());
	for(int i = 1;i<=n;i++) p[i] = p[i-1] + a[i];
	while(q--){
		int x; cin>>x;
		int pos = upper_bound(p.begin() + 1,p.end(),x) - p.begin() - 1;
		cout<<pos<<endl;
	}
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

B题





我们首先考虑什么情况不可能,当操作2必须在操作1前面的时候为不可能,例如下面的这种情况

BBBBA
BBBBB

这种情况就是出现了操作2必须在操作1前面的情况,想要把 A 变成 B,在 A 的前面必须有一次操作一,但是一旦进行了操作 1 ,两个字符串就无法相等。

BAAAAA
AAAAAA

这种情况就是出现了操作2必须在操作1前面的情况,想要把 B 变成 A,操作 1 完成后,操作 2 必须在操作 1 的后面,但是后面任何一个操作 2 会使两个字符串就无法相等

如果存在有解的情况,我们当然要将操作 1 和操作 2 两两配对,但是同样的,操作 1 必须在 操作 2 前面,如果出现了多个操作 2,没有剩下操作 1 配对的话,也是对答案有贡献的

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n; cin>>n;
	string s; cin>>s;
	string t; cin>>t;	
	for(int i = 0;i<n;i++){
		if(t[i] == 'A') break; // BBBBA 
		if(s[i] == 'A'){	   // BBBBB
			cout<<-1<<endl;
			return;
		}
	}
	for(int i = n-1;~i;i--){   // BAAAAA
		if(t[i] == 'B') break; // AAAAAA
		if(s[i] == 'B'){
			cout<<-1<<endl;
			return;
		}
	}
	int ans = 0;
	int pair = 0;
	for(int i = 0;i<n;i++){
		if(s[i] == 'B' && t[i] == 'A') ans++,pair++;
		if(s[i] == 'A' && t[i] == 'B'){
			if(pair) pair--;
			else ans++;
		}
	}
	cout<<ans<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

C题




最后一个说有的人前面的人一定不会是小偷,如果前面的人是嫌疑人,那么他进去的时候应该已经被偷了,他就说谎了。

第一个说没有的人后面的人一定不会是小偷,如果后面的人是嫌疑人,那么他进去的时候还没被偷,他就说谎了。

但是只有小偷会说谎,所以可以判断两种情况矛盾与否。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n; cin>>n;
	int ans = n;
	int l = 0,r = n + 1;
	for(int i = 1;i<=n;i++){
		int x; cin>>x;
		if(x == 1) l = i;
		if(x == 0) r = min(r,i);
	}
	if(r - l + 1 > n) cout<<n<<endl;
	else cout<<max(0ll,r - l + 1)<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

D题



我们可以反过来求答案,把减去的部分求出来,再使用 \(\sum_{i=1}^{n}a_i\) 去掉减去的部分即可,考虑区间DP,设计状态 \(DP[0/1][l][r]\),表示区间 \([l,r]\) 选或不选。

对于区间求和的问题,我们先前缀和预处理即可,DP的状态转移方程如下

\[dp[0][l][r]=min(dp[0][l+1][r]+(p[l]+p[n]-p[r]),dp[1][l+1][r]+((p[l]+p[n]-p[r])*len)) \]

\[dp[1][l][r]=min(dp[1][l][r-1]+(p[l-1]+p[n]-p[r-1]),dp[0][l][r-1]+((p[l-1]+p[n]-p[r-1])*len)) \]

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2e3 + 3;

int dp[2][N][N];

void solve(){
	int n; cin>>n;
	vector<int> a(n + 1);
	vector<int> b(n + 1);
	vector<int> p(n + 1);
	int s = 0;
	for(int i = 1;i<=n;i++) cin>>a[i],s+=a[i];
	for(int i = 1;i<=n;i++) cin>>b[i],p[i] = p[i-1] + b[i];
	for(int i = 1;i<=n;i++) for(int j = 1;j<=n;j++) dp[0][i][j] = dp[1][i][j] = LONG_LONG_MAX;
	for(int i = 1;i<=n;i++) dp[0][i][i] = dp[1][i][i] = 0;
	for(int len=1;len<=n;len++)
		for(int l=1;l+len<=n;l++){
			int r=l+len;
			dp[0][l][r]=min(dp[0][l+1][r]+(p[l]+p[n]-p[r]),dp[1][l+1][r]+((p[l]+p[n]-p[r])*len));
			dp[1][l][r]=min(dp[1][l][r-1]+(p[l-1]+p[n]-p[r-1]),dp[0][l][r-1]+((p[l-1]+p[n]-p[r-1])*len));
	}
	cout<<s-min(dp[0][1][n],dp[1][1][n])<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

标签:int,cin,long,2024,solve,奥赛,操作,CSP,dp
From: https://www.cnblogs.com/longxingx/p/18446515

相关文章

  • 【牛客训练记录】2024牛客国庆集训派对day3
    赛后反思还是只开出来一题TATH题构造一个01矩阵,想要横竖斜三个数都不同,好像方法有很多,我们考虑交错着放010101011010101001010101上面这种长度为\(1\)的01显然不行,因为斜着也算,所以我们考虑构造长度为\(2\)的01,例如00111100这样001100111100110000110011110......
  • 洛谷P10336 [UESTCPC 2024] 2-聚类算法
    涉及知识点:博弈、贪心题意Alice和Bob在玩选点游戏,所有的点在一个\(k\)维空间中,他们轮流选走一个点放入自己的集合中,Alice先手。定义集合\(S\)的权值\(val(S)\)为集合中点两两之间的\(k\)维曼哈顿距离之和。Alice的得分为\(val(S_A)-val(S_B)\),Bob的得分为\(val(......
  • Maven的下载安装(2024最新详细版~)
    1.1、进入Maven的官网地址,下载:Maven–DownloadApacheMaven2.解压安装包到自己的安装目录3.配置环境变量3.1配置到系统Path中3.2验证安装mvn-version4.本地仓库和Settings文件配置4.1、创建自定义仓库,修改settings文件5.AI大模型手册......
  • 20241003
    公交车(bus)显然的题目,答案就是所有连通块的大小减一之和#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e7+5;intn,m,fa[N],sz[N],ans;intfind(intx){if(fa[x]==x){returnx;}returnfa[x]=find......
  • CSP-J/S2024总结
    CSP-J/S2024游记初赛前记今年最后一年J了...希望圆我个2年都没有实现的J一等梦还有希望S考好点期待1=day-1考完不放假,然后月考,高兴坏了day1没什么好说的,行就行,不行就AFO(假CSP-J本来就打算摆烂,所以不慌因为是最后一个考场,只有26人,赢!嗯?开局放int?完辣!组合题放那......
  • 南沙C++信奥赛陈老师解一本通题 1270:【例9.14】混合背包
    ​ 【题目描述】一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些物品的费用总......
  • 20241003校模拟
    A纪念一下本人在校模拟用线段树优化dp单杀*900。最小和最大没有本质区别,这里只讨论最小的情况。设\(f_i\)表示前缀\(i\)的答案,显然是要枚举\(j\)使得\((j,i]\)合并成一段:\[f_i=\min\bigg(f_j+\lceil\dfrac{s_i-s_j}{x}\rceil\bigg)\]其中\(s_i=\sum_{i......
  • P9752 [CSP-S 2023] 密码锁&&P8814 [CSP-J 2022] 解密
    GutenTag!Schön,dichzusehen!今天也是很懒惰的一天呢!所以今天三合一!题目:[CSP-S2023]密码锁题目描述小Y有一把五个拨圈的密码锁。如图所示,每个拨圈上是从$0$到$9$的数字。每个拨圈都是从$0$到$9$的循环,即$9$拨动一个位置后可以变成$0$或$8$,因为校园里......
  • CSP-J模拟赛一补题报告
    IAKIOI!!!前言考的最好的一回:240pts首先开T1,45min干掉了然后T2,45min挂了然后T3,40min又挂了然后发呆了一会把T4骗分打了,此时已过去一坤时40minT2切了,最后20min打了T3骗分又发呆了一会T1:100ptsT2:100ptsT3:30ptsT4:10pts《正文》01011010101001010010101011010100011......
  • devops 2024
    WhatisDevOps?DevOpsisamindset,aculture,andasetoftechnicalpractices.Itprovidescommunication,integration,automation,andclosecooperationamongallthepeopleneededtoplan,develop,test,deploy,release,andmaintainaproduct.Insho......