首页 > 其他分享 >10.19补题记录

10.19补题记录

时间:2024-10-19 15:31:42浏览次数:1  
标签:last 记录 int sum 10.19 补题 bs 操作 dp

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;
}

标签:last,记录,int,sum,10.19,补题,bs,操作,dp
From: https://www.cnblogs.com/d-p-n-i-/p/18475964

相关文章

  • 2024.10.19 1152版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • c语言语法(76-79)10.19
    一.定义数组1.数组定义:2.数组的特点:补:数组内部的特点:左值是读,右值是写3.数组的下标:从0开始计数4.有效的下标范围:从0开始到数组的大小-1的范围当出现以下标志表示数组的下标越界:eg.此代码中的10超过了有效下标9,所以无效会报错二.数组的例子1.eg题目:代码:三.......
  • C语言小白 记录自己对一些概念的理解 若有错误 多包涵 若能指正 万分感激
    指向第一个元素或整个数组用p1=test;直接数组名不用加*而指向第二个或以后的元素则要加*例如p2=&test[1]在C语言中,两个指向同一个数组中相邻元素的指针,计算他们的差值,得到的是它们之间元素的个数,是一个整数比如p1-p0等于1表明第一个到第二个相差一而不是字节数。若想求......
  • 记录Redis+MQ延迟双删保证缓存一致性
    场景描述在博客系统中,用户可以给博客点赞或者评论,这些操作需要更新数据库中的数据,同时要保证缓存中的博客信息与数据库保持一致。为了提高性能,博客数据会存放在Redis缓存中。但当有大量用户同事点赞或是评论时,缓存和数据库中的数据可能出现不一致。何谓延迟双删?延迟双删......
  • uni-app小程序(快手、抖音)getCurrentPages使用坑位记录2
    前情uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验也挺棒的,现公司项目就是主推uni-app,我主要负责抖音和快手端小程序。坑位公司历史原因项目有APP端小程序端,但并不使用uni-app的一端发布所有平台,各端都有它的开发......
  • AtCoder Beginner Contest 371 - VP记录
    总体发挥还算正常A-Jiro呵呵呵,有人像我这么做的吗?点击查看代码#include<cstdio>usingnamespacestd;intmain(){ charab,ac,bc; scanf("%c%c%c",&ab,&ac,&bc); if(ab=='<'&&ac=='<'&&bc=='<')......
  • Educational Codeforces Round 166 (Rated for Div. 2) - VP记录
    比赛链接A.VerifyPassword挨个判断即可,秒了。#include<cstdio>#include<cstring>usingnamespacestd;constintN=25;intT,n;charstr[N];boolis_digit(charch){returnch>='0'&&ch<='9';}boolis_lowercase(charch){re......
  • ROS个人学习记录(跟随教程【Autolabor初级教程】ROS机器人入门:https://www.bilibili.co
    参考文档:http://www.autolabor.com.cn/book/ROSTutorials/index.html1.5ROS架构1.5.1ROS文件系统ROS文件系统级指的是在硬盘上ROS源代码的组织形式,其结构大致可以如下图所示:WorkSpace---自定义的工作空间|---build:编译空间,用于存放CMake和catkin的缓存信息、配置......
  • QT/c++相关记录
     QT的大部分容器类(如QString、QVector等)都是使用隐式共享(implicitsharing)技术,这是通过写时复制(copy-on-write,COW)实现的优化模式。理解这一点的关键在于,Qt的容器类需要在对象拷贝时高效处理数据,而隐式共享则允许在栈上操作容器的同时,在需要时共享内部数据的堆上存储。......
  • MSP430学习记录(1)一种简便的MSP430Ware安装方法
    目前在学习MSP430,用的具体型号是MSP430FR2476。现在是刚起步,以前从来没有学过,希望自己能够快速上手。---------------------------分割线---------------------------今天主要是安装了一下CCS,用的是11版本。看网上说是在TI官网下载例程,找倒是很好找,但是不好下载...为啥呢?它......