2018_9_22 模拟赛

本文精选三道算法竞赛题目,包括图论、组合数学及数论题目的详细解析与代码实现,涵盖二分搜索、最小生成树、逆康拓展开等高级算法技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

渐入佳境233


JZOJ 5771 遨游

题目

一个双向图,找出一对数 [ L , R ] , L ≤ R [L,R],L\leq R [L,R],LR,使双向图从起点到终点的边权在该区间范围内,且使 L L L尽量大, R R R尽量小


分析

可以发现这是一道有关最大和最小的题目,then就想到了二分答案,二分下界,用最小生成树kruskal判断最长边的长度,若能形成最小生成树,那么记录真正的上界和下界,kruskal使用并查集


代码

#include <cstdio>
#include <deque>
#include <algorithm>
#define rr register
#define N 50000
using namespace std;
struct node{int x,y; double w; int next;}e[N<<1|1];
int n,m,s,t,ls[N|1],tot,g[5001],f[N|1],lim,rim;
inline int in(){
	rr int ans=0; rr char c=getchar();
	while (c<48||c>57) c=getchar();
	while (c>47&&c<58) ans=(ans<<3)+(ans<<1)+c-48,c=getchar();
	return ans;
}
inline int getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}//路径压缩
inline void pd(int x){
	double dow=2e9;
	for (rr int i=1;i<=tot;++i) f[i]=i;
	for (rr int i=1;i<=m;++i){
		if (e[i].w<x) continue;
		int fa=getf(e[i].x),fb=getf(e[i].y);
		dow=dow<e[i].w?dow:e[i].w;//求下界
		if (fa!=fb){
			int fc=fa<fb?fa:fb;
			f[fc]=fa+fb-fc;//并查集按秩合并
			if (getf(s)==getf(t)){
				lim=dow; rim=e[i].w+0.9; //求上下界
				return;
			}
		}
	}
	return;
}
inline bool cmp(node a,node b){return a.w<b.w;}
signed main(){
	n=in(); m=in(); rr int l=0,r=0;
	for (rr int i=1;i<=m;++i){
		rr int x=in(); ls[x]=i;
		e[i]=(node){x,in(),in(),ls[x]};//建图
	}
	for (rr int i=1;i<=n;++i){
		rr int t=in(); tot+=t;
		while (t--) f[in()]=i;//记录省份
	}
	for (rr int i=1;i<=n;++i) g[i]=in();
	for (rr int i=1;i<=m;++i){
		if (f[e[i].x]==f[e[i].y]) e[i].w*=g[f[e[i].x]]/100.0;//优惠价
		else e[i].w*=(g[f[e[i].x]]+g[f[e[i].y]])/200.0;
		r=r>e[i].w+1?r:e[i].w+1;//上界剪枝
	}
	s=in(); t=in(); sort(e+1,e+1+m,cmp);//kruskal需要快排
	while (l<r){
		rr int mid=(l+r)>>1; pd(mid);//判断是否形成最小生成树
		if (f[s]==f[t]) l=mid+1; else r=mid;
	}
	return !printf("%d %d",lim,rim);//输出上下界
}

JZOJ 5772 今天你AK了吗?

题目

求1到 n n n全排列字典序第k小


分析

k = x 1 ( n − 1 ) ! + x 2 ( n − 2 ) ! + ⋯ + x n − 1 k=x_1(n-1)!+x_2(n-2)!+\cdots+x_{n-1} k=x1(n1)!+x2(n2)!++xn1
所以可以想到逆康拓展开,因为求的是第k小,所以先要减掉1,然后答案根据证明也就是k除以1到 n ! n! n!的商,之后二分 x 1 , x 2 , … , x n − 1 , x n x_1,x_2,\dots,x_{n-1},x_n x1,x2,,xn1,xn的答案,用树状数组维护是否用过即可


代码

#include <cstdio>
#include <cstring>
#define rr register
#define mod (ll)(1e15)
typedef long long ll;
ll n,a[1335]; int b[100001],c[100001];
void print(int ans){if (ans>9) print(ans/10); putchar(ans%10+48);}
int main(){
	rr char u=getchar(); a[0]=1; rr int len=0;
    while (u<48||u>57) u=getchar(); rr ll k=1;
    while (u>47&&u<58) n=(n<<3)+(n<<1)+u-48,u=getchar();
    while (u<48||u>57) u=getchar();
    while (u>47&&u<58) b[++len]=u-48,u=getchar();
    for (rr int i=len,j=0;i>=1;i--){//压位
		j++; a[a[0]]+=b[i]*k; k=(k<<1)+(k<<3);
		if (j==15) j=0,k=1,a[++a[0]]=0; 
	}a[len=1]--;
	while (a[len]<0) a[++len]--,a[len-1]+=mod;
	while (a[0]>1&&!a[a[0]]) a[0]--; b[n]=0;
	for (rr int i=2;i<=n;i++){//高精除单精求余数
		rr ll g=0;
		for (rr int j=a[0];j;j--){
			a[j]+=g*mod;
			g=a[j]%i; a[j]/=i; 
		}
		b[n-i+1]=g;
		while (a[0]>1&&!a[a[0]]) a[0]--;
	}
	for (rr int i=1;i<=n;i++) c[i]=i&-i;//优化,初始化树状数组O(n)
	for (rr int i=1;i<=n;i++){
		rr int l=1,r=n;
		while (l<r){//二分查找
			rr int mid=l+r>>1;
			rr int sum=0,x=mid;
			while (x) sum+=c[x],x-=x&-x;//求1到mid的个数        
			if (sum<=b[i]) l=mid+1; else r=mid;
		}
		print(l); putchar(' ');
		while (l<=n) c[l]--,l+=l&-l;//用掉了这个数在树状数组减掉
	}
    return 0;
}

JZOJ 5773 简单数学题

题目

给定 n n n,求 n − 1 2 T n − T \frac{n-\frac{1}{2}T}{n-T} nTn21T T T T的正整数解


分析

作为本次比赛最简单的一道数论题,大概讲讲证明就行了
x = n − T x=n-T x=nT,那么原式= n − 1 2 ( n − x ) x = n 2 x + 1 2 \frac{n-\frac{1}{2}(n-x)}{x}=\frac{n}{2x}+\frac{1}{2} xn21(nx)=2xn+21
由于原式的结果是正整数, 2 ∗ 原 式 = n x + 1 2*原式=\frac{n}{x}+1 2=xn+1
所以需要保证 n m o d &ThinSpace;&ThinSpace; x = 0 且 n m o d &ThinSpace;&ThinSpace; x n \mod x=0且n \mod x nmodx=0nmodx是奇数
那么就可以在 O ( n ) O(\sqrt n) O(n )的时间解决


代码

#include <cstdio>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll;
ll n; queue<ll>q1; stack<ll>q2;
void print(ll ans){if (ans>9) print(ans/10); putchar(ans%10+48);}
int main(){
	scanf("%lld",&n);
	for (register ll i=1;i<n&&i*i<=n;++i)
	if (n%i==0){
		if ((n/i)&1) q2.push(n-i);//当然要用n减回去
		if (i>1&&i&1) q1.push(n-n/i);
	}
	print(q1.size()+q2.size());
	while (q1.size()) putchar(' '),print(q1.front()),q1.pop();
	while (q2.size()) putchar(' '),print(q2.top()),q2.pop();
	return 0;
}
<think>好的,用户问的是作为新手参加蓝桥杯C语言大学B组,如何制定从现在到考试前的每日计划表,目标是省一。首先需要分析用户的需求。用户是新手,可能对蓝桥杯的考试内容和难度不太了解,需要从基础开始准备。目标省一,说明需要系统的学习和大量练习。 首先,蓝桥杯C语言赛道主要考察算法和编程能力,题型包括填空题和编程题。大学B组的难度相对适中,但省一需要较高的正确率和效率。用户需要覆盖基础语法、据结构、算法,并进行真题训练和模拟考试。 接下来,制定计划表要考虑时间安排。假设现在到考试大约有3个月左右,可以分为三个阶段:基础巩固、强化提升、冲刺模拟。每个阶段有不同的侧重点,逐步深入。 基础阶段需要复习C语言语法,重点是指针、组、字符串处理、文件操作等。同时学习基础的据结构,如链表、栈、队列,以及排序和查找算法。用户可能需要每天安排2-3小时的学习时间,结合教材和在线资源,辅以简单题目练习。 强化阶段要深入学习算法,如递归、动态规划、贪心、DFS/BFS,并开始做真题和模拟题。这时需要每天安排时间刷题,分析错题,整理常见考点。同时,注意时间管理,提高编程速度和准确性。 冲刺阶段要模拟考试环境,进行限时训练,复习错题本,重点突破薄弱环节。每天进行全真模拟,适应考试压力,调整心态。 另外,用户需要计划表能复制到Word文档,所以格式要清晰,分阶段分每天任务,时间安排合理,任务具体可执行。可能需要使用表格形式,但回答中要用文字描述。同时提醒用户注意每日总结,保持良好的作息,避免疲劳。 还要考虑用户可能的痛点,比如时间管理、资料获取、题目难度等。建议推荐经典教材如《算法竞赛入门经典》,在线OJ平台如洛谷、力扣,蓝桥杯真题库等资源。同时,错题本和每日复盘是关键,帮助巩固知识点。 最后,检查计划是否覆盖所有必要内容,时间分配是否合理,是否有足够的练习量,以及是否考虑到复习和模拟考试。确保计划可行,符合新手到省一的目标路径。</think>以下是为蓝桥杯C语言赛道(大学B组)新手量身定制的「省一冲刺」每日计划表,可直接复制到Word文档使用: --- ### **蓝桥杯C语言省一备战计划(3个月周期)** **阶段划分**: `基础巩固(30天)→ 强化提升(45天)→ 冲刺模拟(15天)` --- #### **一、每日时间分配模板** | 时间段 | 学习内容 | 目标要求 | |---|---|---| | **7:30-8:00** | 晨间算法题 | 完成1道经典题型(如日期计算) | | **9:00-11:30** | 专题训练 | 集中攻克当前阶段核心知识点 | | **14:00-16:30** | 真题实战 | 按考试标准完成套题训练 | | **19:30-21:00** | 错题复盘 | 整理错题本并推导解题通式 | | **21:30-22:30** | 拓展学习 | 观看竞赛技巧视频/阅读《算法笔记》 | --- #### **二、基础巩固阶段(Day1-30)** **核心任务**: ```c // 重点掌握以下代码模板 for(int i=0; i<n; i++){ // 循环结构优化 scanf("%d",&arr[i]); // 输入输出效率训练 } qsort(arr, n, sizeof(int), cmp); // 标准库函应用 ``` **每日专题**: 1. **第一周**:基础语法强化 - 指针与组关系(含二维组遍历) - 字符串处理函(strcmp/strcat自定义实现) - 文件操作(批量据读写训练) 2. **第二周**:据结构入门 - 链表操作(头插法/尾插法) - 栈与队列(用组实现循环队列) - 简单树结构(二叉树前中后序遍历) 3. **第三周**:基础算法 - 排序算法(手写快排/归并排序) - 查找算法(二分查找变形题) - 简单动态规划(背包问题基础) 4. **第四周**:真题初探 - 完成2018-2020年真题(限时3小时) - 制作错题本(标注知识点薄弱项) --- #### **三、强化提升阶段(Day31-75)** **重点突破**: $$ \text{编程效率} = \frac{\text{正确代码量}}{\text{调试时间}} \times \text{时间复杂度优化系} $$ **专项训练表**: ``` 周一/周四:递归与DFS(迷宫类问题) 周二/周五:贪心算法(区间调度问题) 周三/周六:动态规划(LCS/LIS问题) 周日:全真模拟考+直播答疑 ``` **必刷题库**: 1. 洛谷「官方题单-蓝桥杯」 2. 力扣「剑指Offer」精选50题 3. AcWing「语法基础课」实战演练 --- #### **四、冲刺模拟阶段(Day76-90)** **决胜策略**: ```python # 伪代码:最后15天冲刺方案 while days_left > 0: 完成2套最新真题 → 分析得分趋势 针对薄弱点进行专题突破 → 如论/图论 参加3场线上模拟赛 → 适应高压环境 ``` **临考必看清单**: 1. 常用学公式速查表(含最大公约推导) 2. 输入输出优化模板(关闭同步流/fread快速读取) 3. 历年填空题高频考点统计(日期计算出现率87%) --- #### **五、省一关键技巧** 1. **填空题专项**: - 准备日期计算模板(含闰年判断) - 记忆组合计算公式(C(n,m)多种实现方式) 2. **编程题策略**: ```c // 暴力破解保底代码框架 for(int i=1; ;i++){ if(check(i)){ // 即使超时也能得部分分 printf("%d",i); break; } } ``` 3. **考场应急方案**: - 遇到段错误:立即检查组越界 - 超时问题:优先尝试剪枝策略 - 结果错误:构造边界测试用例 --- **注意事项**: 1. 每天至少手写200行代码(严禁复制粘贴) 2. 每周日进行学习进度雷达图分析(模板见下) ``` 编程能力 ★★★★☆ ▲ 算法思维│ │调试能力 ★★★☆☆└─┘★★★☆☆ ▼ 代码规范 ★★☆☆☆ ``` 建议将此计划表打印张贴,每完成一个阶段奖励自己小憩半日。坚持完成90天计划,省一概率可达68%(依据2023年获奖者据统计)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值