Day 2

最后更新于 2025-08-02 22:51:01
作者
分类 个人记录

小梦的铁索连环

我看这个小梦不是军师是间谍吧

这题其实就是让你求这个图里的一个子图,是不是完全图再看这个完全图的点权只和是多少,求最大的点权之和。

注意⚠️,他这里说不能交叉,而再不能交叉的情况下最多只能选4个点所以我们完全可以打四重循环♻️枚举。

错误代码这个代码就是纯纯的愚蠢代码:

#include<bits/stdc++.h>
using namespace std;
const int N=500;
//int g[N][N];
vector<int> vec[N];
int a[N];
long long ton[N];
bool vis[N];
void dfs(int u){
	vis[u]=true;
	ton[vec[u].size()]+=a[u];
	for(int i=0;i<vec[u].size();i++){
		int v=vec[u][i];
		if(!vis[v]){
			dfs(v);
		}
	}
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		vec[u].push_back(v);
		vec[v].push_back(u);
//		g[u][v]=true;
//		g[v][u]=true;
	}
	dfs(1);
	long long ans=0;
	for(int i=1;i<n;i++)ans=max(ans,ton[i]);
	cout<<ans;
	return 0;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=500;
int a[N];
int  p[N][N];
vector<int> g[N];
int main(){
	int n,m;
	cin>>n>>m;
	int ans=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		p[u][v]=p[v][u]=1;
		if(u>v)swap(u,v);
		g[u].push_back(v); 
	}
	for(int i = 1; i <= n; i++){
		int size = g[i].size();
		for(int j = 0;j < size; j++){
			ans = max(ans, a[i] + a[g[i][j]]);
			for(int k = j + 1;k < size; k++){
				if(!p[g[i][j]][g[i][k]])continue;
				ans = max(ans, a[i] + a[g[i][j]] + a[g[i][k]]);
				
				for(int h = k + 1; h < size; h++){
					if(!p[g[i][h]][g[i][k]] || !p[g[i][h]][g[i][j]])continue;
					ans = max(ans, a[i] + a[g[i][j]] + a[g[i][k]] + a[g[i][h]]);
				}
			}
		}
	}
	cout<<ans;
	return 0;
}

错题二忙碌的老师

这题纯纯的贪心需要用到优先队列优先队列使用技巧:

priority_queue<int> q;//定义一个优先队列q
q.push(a);//往队列中插入一个元素a 
q.top();//取队首元素
q.pop()//弹出队首元素
priority_queue<int,vector<int>,greater<int>> p;
struct node {
    bool operator()(int a, int b) const {
        return a > b; // 小根堆
    }
};

错误代码:没有

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
struct node{
	int l,r;
}a[N];
bool cmp(node a,node b){
	return a.l<b.l;
}
signed main(){
	int n;
	cin>>n;
	priority_queue<int, vector<int>, greater<int> > q;
	for (int i = 1; i <= n; i++) cin >> a[i].l >> a[i].r; 
	sort(a+1,a+1+n,cmp);
	sort(a + 1, a + 1 + n, cmp); 
	int ans = 1;
	q.push(a[1].r);
	for (int i = 2; i <= n; i++) {
	    if (q.top() > a[i].l) {
	        ans++;
	        q.push(a[i].r);
	    } else {
	        q.pop();
	        q.push(a[i].r);
	    }
	}
	cout<<ans;
	return 0;
}

找AI又学习了一下优先队列

#include <iostream>
#include <queue>
#include <vector>
#include <functional> 
using namespace std;

int main() {
    // 方法1:默认比较(大顶堆,按first排序)
    priority_queue<pair<int, string>> pq1;  // first大的优先
    
    // 方法2:小顶堆(按first排序)
    // 使用greater: first小的优先
    priority_queue<pair<int, string>, vector<pair<int, string>>, greater<>> pq2;
    
    // 方法3:函数对象(按second长度排序)
    struct CmpLen {  // 名称简洁
        bool operator()(const auto& a, const auto& b) const {
            return a.second.length() > b.second.length(); // 短字符串优先
        }
    };
    priority_queue<pair<int, string>, vector<pair<int, string>>, CmpLen> pq3;
    
    // 方法4:Lambda表达式(按first升序)
    auto cmp = [](const auto& a, const auto& b) { 
        return a.first > b.first;  // 小顶堆
    };
    priority_queue<pair<int, string>, vector<pair<int, string>>, decltype(cmp)> pq4(cmp);
    
    // 方法5:函数指针(按first降序)
    bool fcmp(const auto& a, const auto& b) { // 函数名简洁
        return a.first < b.first;  // 大顶堆
    };
    priority_queue<pair<int, string>, vector<pair<int, string>>, decltype(&fcmp)> pq5(fcmp);
    
    // 方法6:多级排序(先first降序,再second长度升序)
    struct MultiCmp {  // 名称简洁
        bool operator()(const auto& a, const auto& b) const {
            if (a.first != b.first) 
                return a.first < b.first;  // first大的优先
            return a.second.length() > b.second.length(); // 长度短的优先
        }
    };
    priority_queue<pair<int, string>, vector<pair<int, string>>, MultiCmp> pq6;
    
    // ===== 使用示例 =====
    // 填充数据到pq6
    pq6.push({3, "Fox"});
    pq6.push({3, "Elephant"});
    pq6.push({1, "Cat"});
    pq6.push({2, "Bird"});
    pq6.push({3, "Ant"});
    
    cout << "多级排序结果:\n";
    while (!pq6.empty()) {
        auto [num, str] = pq6.top();  // C++17结构化绑定
        cout << num << " - " << str << " (len:" << str.length() << ")\n";
        pq6.pop();
    }
    /* 输出:
        3 - Ant (len:3)
        3 - Fox (len:3)
        3 - Elephant (len:8)
        2 - Bird (len:4)
        1 - Cat (len:3)
    */
    
    return 0;
}