2025.7.24 CSP-S模拟赛25

终于打上S组的模拟赛力 (喜

T1 花菖蒲

简单构造题;

对于 \(b=0\) 的部分,我们考虑构建一个菊花图,其中有 \(a\) 个一度点,要特判当 \(a=3\) 时无解,因为此时会有一个三度点,不符合题意;

对于 \(b=a-2\) 的部分,我们从小到大考虑,容易发现当 \(a=3,b=1\) 时,其由一个三度点连接三个一度点构成,然后我们每次挑选一个一度点,给他连接两条边构成一个新的三度点,同时一度点也增加了一个,那么 \(a\)\(b\) 的差值是不变的,持续拓展直到满足题目中的要求即可

经过刚才思路的启发,我们只要先构成一颗树,满足其具有 \(a-b\) 个一度点,然后运用刚才的方法拓展,注意加一点小特判就是正解了,代码如下:

#include<bits/stdc++.h>
using namespace std;
int a,b,cnt;
queue<int> q;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>a>>b;
	if(!a&&b) cout<<"0\n";
	else if(b==0){
		if(a==3){
			cout<<"0\n";
		}
		else{
			cout<<a+1<<"\n";
			for(int i=1;i<=a;i++){
				cout<<i<<" "<<a+1<<"\n";
			}
		}
	}
	else if(b==a-2){
		cout<<a+b<<"\n";
		cout<<"1 4\n";
		cout<<"2 4\n";
		cout<<"3 4\n";
		cnt=4;
		if(cnt!=a+b){
			q.push(1),q.push(2),q.push(3);
			while(!q.empty()){
				int x=q.front();
				q.pop();
				cout<<x<<" "<<++cnt<<"\n";
				if(cnt<=a+b) q.push(cnt);
				cout<<x<<" "<<++cnt<<"\n"; 
				if(cnt<=a+b) q.push(cnt);
				if(cnt==a+b) break; 
			}
		}
	}
	else{
		if(a>b){
			int cs=a-b;
			if(cs!=1&&cs!=3){
				cout<<a+b+1<<"\n";
				for(int i=2;i<=1+cs;i++){
					cout<<"1 "<<i<<"\n";
					q.push(i);
				}
				cnt=1+cs;
				for(int i=1;i<=b;i++){
					int x=q.front();q.pop();
					cout<<x<<" "<<++cnt<<"\n";
					q.push(cnt);
					cout<<x<<" "<<++cnt<<"\n";
					q.push(cnt);
				}
			}
			else{
				cout<<"0\n";
			}
		}
		else{
			cout<<"0\n";
		}
	}
	return 0;
} 

T2 百日草

意义不明的dfs,赛时代码少了一点剪枝,加上就过了(正解是bfs来着,其实差不多);

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
long long n,m,ans;
struct edge{
	long long pos,val;
};
vector<edge> e[MAXN];
long long f[MAXN];
void dfs(long long x,long long t,long long v){
	if(v>=ans||v>=f[x]||t>=n) return ;
	if(x==n){
		ans=min(ans,v);
		return ;
	}
	f[x]=v;
	for(edge i:e[x]){
		dfs(i.pos,t+1,max(v,i.val*(t+1)));
	}
	return ;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		if(x==y) continue;
		e[x].push_back({y,z});
	}	
	for(int i=1;i<=n;i++) f[i]=LONG_LONG_MAX;
	ans=LONG_LONG_MAX;
	dfs(1,0,0);
	cout<<ans;
	return 0;
}

T3 紫丁香

图比较难办,我们考虑构建一棵生成树,因为答案要求字典序最大,所以我们按照边的编号建最大生成树,将修改限制在生成树中,考虑除了根节点以外的每个点,我们都可以根据其度数考虑删除或保留与父亲的连边,对点打上修改标记;对于偶数度点,两两匹配,反转其之间的简单路径,如果最后可以匹配完,则直接dfs出答案,否则对于剩下的一个点,将其钦定为根,贪心构造答案即可;

代码看这个吧(逃 :题解

T4 麒麟草

改不了一点,直接看xzz大佬的题解 题解

posted @ 2025-08-10 19:30  zhangch_qwq  阅读(15)  评论(0)    收藏  举报