2024CAIP省赛


title: 2024CAIP省赛
date: 2024-07-16 22:13:50
tags: 总结
categories: 比赛

总结写在前面,就一句话

状态的保持胜过少女的娇羞

RC-u1 热҈热҈热҈

思路

按题意,大于35的,判断是否为星期四,统计数量即可

RC-u2 谁进线下了?

思路

按题意模拟即可。

RC-u3 暖炉与水豚

思路

枚举每一个暖炉,将合法的水豚标记,最后会剩一个不合法的,然后搜索这个不合法的水豚周围3x3,记录合法的隐藏的位置

RC-u4 章鱼图的判断

思路

建无向图,记录每个点的度,拓扑去每个环的枝条,最后枚举每一个环,有一种特殊情况,就是多环共点,这个情况是需要去除。

代码
vector<int> g[N];
int d[N];
int cnt,ans;
int n,m;

//搜环
void dfs(int x){
	d[x] = 0;
	for(auto v : g[x]){
		if(d[v]){
			dfs(v);
			cnt ++;
		}
	}
}
//tuopu去支
void DAG()
{
	queue<int> q;
	for(int i = 1; i <= n ; i ++){
		if(d[i] == 1){
			q.push(i);
		}
	}
	while(!q.empty()){
		int t = q.front();
		q.pop();
		d[t] --;
		for(auto v : g[t]){
			d[v] --;
			if(d[v] == 1){
				q.push(v);
			}
		}
	}
}
void solve(){
	cin >> n >> m;
	
	memset(d,0,sizeof d);
	for(int i = 1; i <= m ; i ++){
		int u,v;
		cin >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
		d[u] ++,d[v] ++;
	}
	DAG();
	
	//多环一点情况下,4 2 2,去除该情况
	for(int i = 1; i <= n; i ++){
		if(d[i] && d[i] != 2){
			dfs(i);
		}
	}
	
	ans = cnt = 0;
    //
	for(int i = 1 ; i <= n; i ++){
		if(d[i] == 2){
			cnt = 1;
			dfs(i);
			ans ++;
		}
	}
	
	if(ans == 1) cout << "Yes " << cnt << "\n";
	else cout << "No " << ans << "\n";
	for(int i = 1; i <= n ; i ++){
		g[i].clear();
	}
	
}
int main()
{
	int t; cin >> t;
	while(t --) solve();
	return 0;
}

RC-u5 工作安排

思路

题意可以转换为01背包,这是一个典型的01背包模型。外循环枚举事件,内循环枚举体积,最后遍历求最大值即可。

void solve()
{
    int n;
	cin >> n;
	vector<array<int,3>> vec(n + 1);
	for(int i = 1; i <= n ; i ++){
		int t,d,p;
		cin >> t >> d >> p;
		vec[i] = {d,t,p};
	}
	sort(vec.begin() + 1,vec.end());
	vector<int> l(n + 1),v(n + 1),w(n + 1);
	for(int i = 1; i <= n ;  i++){
		l[i] = vec[i][0];
		v[i] = vec[i][1];
		w[i] = vec[i][2];
	}
	vector<int> dp(5050);
	for(int i = 1;i <= n ; i ++){
		for(int j = 5000; j >= 0; j --){
			if(j >= v[i] && j <= l[i]){
				dp[j] = max(dp[j - v[i]] + w[i],dp[j]);
			}
		}
	}
	ll maxx = 0;
	for(int i = 1; i <= 5000; i ++) maxx = max(maxx,dp[i]);
	cout << maxx << endl;
}
signed main()
{
	int t; 
	t = 1;
	cin >> t;
	while(t --){
		solve();
	}
	return 0;
}
  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值