我看这个小梦不是军师是间谍吧
这题其实就是让你求这个图里的一个子图,是不是完全图再看这个完全图的点权只和是多少,求最大的点权之和。
注意⚠️,他这里说不能交叉,而再不能交叉的情况下最多只能选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;
}