10.19补题记录

news/2024/10/19 15:44:06

https://codeforces.com/gym/104821/problem/F
交换操作顺序 我们来想想什么那些操作不能交换操作顺序 每个点最后的数值只和最后一次改变这个点的大小有关 所以如果我们要保证一个点的数值不变的话我们只要保证最后一操作后不再改变这个点的数值就ok那么我们先找出那些是某些点的最后一次操作 看看可不可以和他前一个操作交换(为什么是前一个呢 因为前一个需要满足的条件比较少 并且又完成了题目的要求 那么为什么不是后一个呢 因为我们可以确保关于这个点只要前一个没有这个点 这两条操作就一定可以交换 但是对于后一条操作 我们不确定他们判断的点是那一个)可不可以交换的条件就是上一个操作有没有这个点 然后我们再遍历一下全部的操作看看有没有可以换的就okk了

// last[i]:最后修改位置 i 的操作
int last[MAXM + 10];
// OP[i]:操作 i 改了哪些位置
unordered_set OP[MAXN + 10];
// flag[i]:操作 i - 1 到 i 是否有一条连边
bool flag[MAXN + 10];

void solve() {
scanf("%d%d", &n, &m);//n个操作 m个点
memset(last, 0, sizeof(int) * (m + 3));
for (int i = 1; i <= n; i++) OP[i].clear();
memset(flag, 0, sizeof(bool) * (n + 3));

for (int i = 1; i <= n; i++) {int p; scanf("%d", &p);for (int j = 1; j <= p; j++) {int x; scanf("%d", &x);last[x] = i;//这个点的最后一次操作是第几个操作OP[i].insert(x);}
}// 边只有修改每个位置的最后一次操作可能与前面的操作有连
// 枚举每个位置,并检查最后一次操作
for (int i = 1; i <= m; i++) if (last[i] > 1) //这个点的最后一次操作不是1 看看可不可以和前面一个操作换// 如果 last[i] - 1 也改了位置 i,则两个操作之间有连边,也就是说两个操作是不可以调换顺序的if (OP[last[i] - 1].count(i)) flag[last[i]] = true;int ans = 0;
// 寻找没有与上一个操作连边的操作
for (int i = 2; i <= n; i++) if (!flag[i]) { ans = i; break; }//找一个没有连接的
if (ans > 0) {printf("Yes\n");for (int i = 1; i <= n; i++) {if (i == ans - 1) printf("%d", ans);else if (i == ans) printf("%d", ans - 1);else printf("%d", i);printf("%c", "\n "[i < n]);}
} else {printf("No\n");
}

}

https://codeforces.com/gym/104821/problem/G
一开始想是背包 但是又还有k个免费的 那就想假设我们已经知道了我们最后有哪些宝石那我们获得他们最优的方法是选k个贵的然后剩下的是我们自己买的 这样我们会发现问题变成了两个因为k个选完后我其他的就是01背包问题 再加上我们选择的k个的钱肯定大于我们自己买的钱 所以我们会想到先按钱排序然后去遍历在一段选出k在哪一段用dp
bool cmp(pp a,pp b)
{
return a.w>b.w;
}
void solve()
{
int n,W,k;
cin>>n>>W>>k;
for(int i=1;i<=n;i++)
{
cin>>bs[i].w>>bs[i].v;
}
sort(bs+1,bs+1+n,cmp);
priority_queue<int,vector,greater> p;//小根堆
//priority_queue p;//大根堆
int sum=0;
for(int i=1;i<=k;i++)
{
p.push(bs[i].v);
sum+=bs[i].v;
}
memset(dp,0,sizeof dp);
for(int i=n;i>=1;i--)
{
m[i]=0;
for(int j=W;j-bs[i].w>=0;j--)
{
dp[j]=max(dp[j],dp[j-bs[i].w]+bs[i].v);
m[i]=max(dp[j],m[i]);
}
}
//m[n+1]=0;
int ma=0;
ma=max(sum+m[k+1],ma);
for(int i=k+1;i<=n;i++)
{
if(p.size() && p.top()<bs[i].v)
{
sum-=p.top();
p.pop();
sum+=bs[i].v;
p.push(bs[i].v);
}
ma=max(ma,sum+m[i+1]);
}
cout<<ma<<endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/73467.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

修改VS的代码高亮颜色

点击工具->选项选择“字体和颜色”找到“用户成员-xx”、“用户类型-xx”,点击即可修改前景色、背景色

ArkUI-Image详解

ArkUI-Image详解 文章摘要: 给Image组件设置属性可以使图片显示更灵活,达到一些自定义的效果。以下是几个常用属性的使用示例。这时可以使用interpolation属性对图片进行插值,使图片显示得更清晰。Image组件引入本地图片路径,即可显示图片(根目录为ets文件夹)。通过rende…

强化学习算法笔记之【DDPG算法】

强化学习笔记第2篇,讲解DDPG算法。 感兴趣可以参考或者复刻。强化学习笔记之【DDPG算法】 目录强化学习笔记之【DDPG算法】前言:原论文伪代码DDPG 中的四个网络代码核心更新公式前言: 本文为强化学习笔记第二篇,第一篇讲的是Q-learning和DQN 就是因为DDPG引入了Actor-Crit…

python输出hello world

输出print("hello world")

2161: 【例9.3】小写字母转大写字母 【超出字符数据范围】

include <bits/stdc++.h> using namespace std; int main( ) { char a; cin >> a; cout << char(a-32); return 0; } // 反思1: cin >> a; 忘记写了 反思2: +是转为小写字母-是转为大写字母 【做错】

航飞参数计算

作者:太一吾鱼水 宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 声明:博客写的比较乱,主要是自己看的。如果能对别人有帮助当然更好,不喜勿喷! 文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家…

第4课 SVN

1、svn的定义: svn是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式管理。 2.snv的作用: 在项目中对需求规格说明书,测试用例,代码,以及项目项目的文件进项管理和分享。 3、svn…

npm run的时候报错: this[kHandle] = new _Hash(algorithm, xofLen);

在前面加入以下配置信息 set NODE_OPTIONS=--openssl-legacy-provider && 后面跟原来的启动配置信息 凡哥,别他妈吹牛逼了