2024CCPC女生专场补题&题解(C A H)


PDF中文题面
PDF题解

C CCPC

题目链接

赛时拿到的纸质版题面这个题是A题,所以先写的这个。想着签到题应该很简单,直接输出了min(c/3,p),没有考虑CCPCCPC这种情况,wa了以后很着急,没有想好正确的公式是怎样的,试了很多次
后来特判了c<3||p==0的情况,cout << min( (c-3)/2+1, p);

题解

统计字符串S中C和P字符的个数cntC,cntP。
若 cntC<3 或 cntP<1 则答案为0。
否则答案为min(⌊ (cntC−1)/2 ⌋,cntP)。
时间复杂度O(|S|)。

AC代码

#include<bits/stdc++.h> 
using namespace std;
int T=1; 
void solve(){
    string s;
    cin >> s;
    int c=0, p=0;
    for(int i=0;i<s.size();i++){
    	if(s[i]=='C') c++;
    	else if(s[i]=='P') p++;
	}
	if(c<3||p<1){
		cout <<"0\n";
	}
	else{
		cout << min( (c-3)/2+1, p);
	}
}

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

A 盒子

题目链接

题面
当时被题面误导,将xy分别对应长宽都判断了,扩大了输出YES的范围,wa了一次之后一直不敢交,过了H题才提交,提交之后才看到讨论区发布的提醒

题解

给出三维坐标都与空间直角坐标系O−xyz的三条轴平行的长方体盒子的底面z坐标z0,高度h,底面对角线坐标(u0, v0), (u1,v1) 和 q 个点 (xi,yi,zi),问每个点是否在盒子内。

AC代码

#include<bits/stdc++.h> 
#define YES cout<<"YES\n";
#define NO  cout<<"NO\n";
using namespace std;
int T=1; 
void solve(){
    int z0,h,u0,v0,u1,v1;
	int q;
    cin >> z0 >> h >> u0 >> v0 >> u1 >> v1;
	cin >> q;
	while(q--){
		int x,y,z;
		cin >> x >> y >> z;
		if( z<=z0+h && z>=z0 &&
			x<=max(u0,u1) && x>=min(u0,u1) &&
			y<=max(v0,v1) && y>=min(v0,v1)
		) YES
		else NO
	} 
}

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

H 平方根

题目链接

首先想到 n 个 √1 相加一定大于等于 √n,由于题意要将1变为0,可以想到111的情况下 (√1+√1)=2 > √3,但是1111会有 (√1+√1)=2 < (1+√2)。可以推导当有奇数个1在一起时,把所有偶数位的1变成0可以得到最大值;当有偶数个1在一起时,把除了最后一位以外所有的偶数位1变成0可以得到最大值
在写代码之前先二分了 √2 的值到1e-11的精度,然后const double g2=1.41421356233;

题解

每一段连续的1之间是独立的,我们只需要关心一段连续的1的结果。
可以证明对于一段连续的1,最优策略是将其划分成多个单独的1 以及可能余下的连续两个1。
具体来说,对于k个连续的1,如果k是奇数,最优策略是将其划分为 (k+1)/2 个单独的1,答案为 (k+1)/2 ;否则最优策略是将其划分为 k/2−1个单独的1和两个连续的1,答案为 k/2−1+√2。
时间复杂度O(|s|)。

AC代码

#include<bits/stdc++.h> 
using namespace std;
const double g2=1.41421356233;
int T=1; 
void solve(){
    string s;
    cin >> s;
    double ans=0;
    int cnt=0;
    for(int i=0;i<s.size();i++){
    	if(s[i]=='1'){
    		cnt++;
		}else if(cnt>0){
			if(cnt%2){
				ans+=(cnt+1)/2;
			}else{
				ans+=(cnt-2)/2+g2;
			}
			cnt=0;
		}
	}
	if(cnt>0 && cnt%2){
		ans+=(cnt+1)/2;
	}else if(cnt>0 && cnt%2==0){
		ans+=(cnt-2)/2+g2;
	}
	printf("%.10lf\n",ans);
}

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

补充:二分求 √2 代码

#include<bits/stdc++.h> 
using namespace std;
int T=1; 
void solve(){
    double l=1;
    double r=2;
    while(r-l>1e-11){
    	double mid=(l+r)/2;
    	if(mid*mid>2) r=mid;
    	else l=mid;
	}
	printf("%.11lf",l);
}

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

L题M题待补充

最后贴一个提交记录纪念一下吧,没多久就要退役了
提交记录
CAH

目前尚未找到关于2024年河北省CCPC的具体官方信息。然而,可以基于以往的比情况推测一些可能的内容。 ### 参准备与注意事项 通常情况下,CCPC(中国大学生程序设计竞)会在每年的秋季举行区域。参者需注意以下几点: 1. **团队协作** 每支队伍由三名队员组成,分工合作至关重要。例如,在之前的比中,有队伍因签到题失误而导致时间浪费和罚时增加[^1]。因此,合理分配题目并快速定位错误是成功的关键。 2. **算法模板储备** 动态规划(DP)、图论、字符串处理等常见算法应熟练掌握。比如动态规划的一个经典实现如下所示: ```cpp #include &lt;bits/stdc++.h&gt; using namespace std; int k, n, m, dp[1005][1005]; int a[1005], b[1005]; int pa[1005] = {0}, pb[1005] = {0}; queue&lt;int&gt; q[1005]; int main() { int ak; cin &gt;&gt; ak; while (ak--) { for (int i = 1; i &lt;= n; i++) while (!q[i].empty()) q[i].pop(); scanf(&quot;%d%d%d&quot;, &amp;k, &amp;n, &amp;m); memset(dp, 0, sizeof(dp)); memset(pa, 0, sizeof(pa)); memset(pb, 0, sizeof(pb)); for (int i = 1; i &lt;= n; i++) cin &gt;&gt; a[i]; for (int i = 1; i &lt;= m; i++) cin &gt;&gt; b[i]; for (int i = 1; i &lt;= n; i++) { q[a[i]].push(i); if (q[a[i]].size() == k) { pa[i] = q[a[i]].front(); q[a[i]].pop(); } } for (int i = 1; i &lt;= n; i++) while (!q[i].empty()) q[i].pop(); for (int i = 1; i &lt;= m; i++) { q[b[i]].push(i); if (q[b[i]].size() == k) { pb[i] = q[b[i]].front(); q[b[i]].pop(); } } for (int i = 1; i &lt;= n; i++) { for (int j = 1; j &lt;= m; j++) { dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); if (a[i] == b[j] &amp;&amp; pa[i] != 0 &amp;&amp; pb[j] != 0) dp[i][j] = dp[pa[i] - 1][pb[j] - 1] + k; } } printf(&quot;%d\n&quot;, dp[n][m]); } return 0; } ``` 3. **模拟训练** 定期参加ACM/ICPC风格的在线比或学校内部模拟有助于提升实战能力。通过解决类似矩形面积计算等问题来增强几何算法的理解[^3]。 ### 事安排预测 虽然具体日期未公布,但根据往年惯例,建议关注以下几个方面: - 报名截止时间和方式; - 初步计划中的比地点及日程表; - 是否存在线上预选环节。 #### 提醒事项 务必留意官网公告以及教练通知,及时调整复习策略以应对可能出现的新变化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值