【算法每日一练】- 今天回顾一下写过的最蠢的代码 #旅游买票 竞争主席 #哨兵游戏 #最大边权和

目录

今日知识点:

整体考虑,把问题转化成装大于一半的背包问题

两两点匹配问题,注意去重方式的dfs的写法

旅游买票

竞争主席

哨兵游戏

最大边权和 


        

        

旅游买票

318C:要旅游n天,一共有两种选择,一种是买当日票Fi元,一种是买D日票P元(这任意D天都可以免票)  问旅游n天最少花多少钱?

思路:

刚开的思路是贪心:先Fi排序,然后把票价低于P/D的都买掉,然后凑D票张数。但是我突然注意如果只剩余一天,再去买D票就不划算了。这个想法肯定不是最优解,因为本可以再少买几张当日票,使D日票没有剩余。故贪心不成立。再一看仅仅是一道C题。应该没那么麻烦吧。

然后我就想到了可以暴力模拟买D日票的数量,然后剩余的票买当日票,计算对应最优的价格,然后用前缀和优化速度即可!

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int f[N],n,d,p;
ll sum[N],ans=1e15;
//ll min(ll x,ll y){
//	if(x>y)return y;
//	else return x;
//}
int main(){cin>>n>>d>>p;sum[0]=0;for(int i=1;i<=n;i++){scanf("%d",&f[i]);}sort(f+1,f+n+1);for(int i=1;i<=n;i++)sum[i]+=sum[i-1]+f[i];int len=0,tmp=n/d;	for(ll i=0;i<=tmp+1;i++){len=n-i*d;if(i==tmp+1)ans=min(ans,p*i);//爆int了else ans=min(ans,p*i+sum[len]-sum[0]);}cout<<ans;
}

        

         

竞争主席

317D 

题意:AB两人竞争主席一共n场,每场有x,y,z。x+y为奇数且x,y代表A,B的支持人数,z为席位数,支持数多的一方赢得z席位数,最终席位数多的赢。问为了让A赢,最少要使多少支持B的人转向支持A?

思路:

原思路是:只考虑A和B目前两者之间的Z差距,并记录每个Zi的代价Wi,然后求使Z为负值所需的最少代价,负值???诶我去?

然后又想了几想:(这肯定能转化成背包的)

其实应该从头考虑,考虑A和B的Z之和,同样记录每个Zi的代价Wi,然后求拿到至少大于Z/2所需的最少代价即可,这样就能做了。

设置dp[i][j]表示遍历到i场,且已经获得j席位时对应的最少贿赂人数。求dp[n][>=Z/2]的最小值
背包问题都是这个式子:dp[i][j]=min(dp[i-1][j],dp[i-1][j-z]+w) 

又因为都只和上一场有关,降成二维就是:dp[i]=min(dp[i],dp[i-z]+w)
其实本题就是装至少一半的背包问题。

#include <bits/stdc++.h>
using namespace std;     
typedef long long ll;
const int N=105,M=1e5+5;//dp[i][j]表示遍历到i场,且已经获得j席位时对应的最少贿赂人数
ll dp[M],w[N],v[N],s,n,ans=1e18;//W[i]为A获得Zi席位数需要的代价,V[i]即Zi
int main(){cin>>n;ll x,y,z;for(int i=1;i<=n;i++){cin>>x>>y>>z;v[i]=z;w[i]=max(0ll,(x+y+1)/2-x);//max只能处理同类型的s+=z;}memset(dp,0x7f,sizeof(dp));dp[0]=0;for(int i=1;i<=n;i++){for(int j=s;j>=v[i];j--){dp[j]=min(dp[j],dp[j-v[i]]+w[i]);}}for(int i=(s+1)/2;i<=s;i++)//找最佳答案ans=min(ans,dp[i]);cout<<ans;
}

        

        

哨兵游戏

317 E

一个h*w大小的地图:>  <  v  ^ 为四种看哨兵可以向右,左,下,上看到障碍物或人为止  .为道路  #为墙  S为起点  G为终点。问能否从起点走到终点且不被发现(哨兵格子也不能走)

思路:

先对地图进行预处理,然后进行正常跑图就完事了。

#include <bits/stdc++.h>
using namespace std;
char s[2005][2005];
int flag,h,w,ans,s1,s2;
int vis[2005][2005],dx[]={1,0,-1,0},dy[]={0,1,0,-1};
struct node{int x;int y;};
void bfs(int x,int y){queue<node>q;q.push(node{x,y});while(!q.empty()){if(flag==1)return;ans++;int sz=q.size();//一步一步的bfs即可while(sz--){node cur=q.front();q.pop();for(int i=0;i<4;i++){int nx=cur.x+dx[i],ny=cur.y+dy[i];if(nx<0||nx>=h||ny<0||ny>=w||vis[nx][ny]==1)continue;//这里不能写 s[nx][ny]!='.'(好了,你现在知道了我那时候多蠢了吧,呜呜呜呜呜)if(s[nx][ny]=='G')flag=1;if(s[nx][ny]=='.')q.push(node{nx,ny}),vis[nx][ny]=1;//入队后就赶紧标记}}	}
}
int main(){cin>>h>>w;int tmp;for(int i=0;i<h;i++)scanf("%s",s[i]);for(int i=0;i<h;i++)for(int j=0;j<w;j++){//对地图预处理一下,把不能走的 . 变成!if(s[i][j]=='S')s1=i,s2=j;if(s[i][j]=='>'){tmp=1;while(j+tmp<w&&(s[i][j+tmp]=='.'||s[i][j+tmp]=='!')){//这里要加上! 因为!只是我们自己加上去的s[i][j+tmp]='!';tmp++;	}}if(s[i][j]=='v'){tmp=1;while(i+tmp<h&&(s[i+tmp][j]=='.'||s[i+tmp][j]=='!')){s[i+tmp][j]='!';tmp++;	}}if(s[i][j]=='<'){tmp=1;while(j-tmp>=0&&(s[i][j-tmp]=='.'||s[i][j-tmp]=='!')){s[i][j-tmp]='!';tmp++;	}}if(s[i][j]=='^'){tmp=1;while(i-tmp>=0&&(s[i-tmp][j]=='.'||s[i-tmp][j]=='!')){s[i-tmp][j]='!';tmp++;	}}}vis[s1][s2]=1;bfs(s1,s2);if(flag==0)cout<<-1;else cout<<ans;
}

        

         

最大边权和 

318D

题意:给你n个点的带权w的完全无向图(第1个点有n-1条边,第2个点有n-2条……)问你相互没有重点的所有边最大权值和是多少?     n<=16; W<=10^9  

举个例子:比如n=4,有(1,2)(1,3)(1,4)(2,3)(2,4)(3,4)的权值。搭配有:(1,2)(3,4); (1,3)(2,4); (1,4)(2,3)其中权值和最大的就是答案。

思路:

看似是一道跑图题,实则就是一道配对题(你细品这个完全无向图,在dfs时候完全没有跑图的影子)。如果选了一个点,那么无论匹配那个点,都会导致剩余n-2各点,剩下的点的选择就会越来越少:故有15*13*11*9*7*5*3*1=2027025种答案,暴力完全能过。

先说一下这个dfs函数:

首先是ans的获取:每递归一次就获取一次。不用先存起来再求。免去了回溯的存数和删数操作。

然后是先dfs(u+1,sum);  再if(vis[u]) return ;顺序不要写反。前面是不选此数(跳过此数去选别的数),后面的是此数已被选过,剩余的操作不用再执行。

最后是dfs(u+1,sum+a);其实我们是已经去重的,因为u+1表示被选的另一个点一定比此点更大,就保证了无重复。而不是保持升序来去重,那样子只是相当于所有数的全排去重,而此题只需要两两数的全排去重。

void dfs(ll u,ll sum){//u是层数,sum和当前权值和。没有必要去重,重复就重复吧ans=max(ans,sum);//处理一次获取一次答案,没必要全部选完后再获取答案if(u==n+1)return ;//处理越界:因为下一句就是无条件dfsdfs(u+1,sum);//这是当前点不选对应的情况,因为我们题上可能会给出奇数点,必然有个点选不上if(vis[u]) return ;for(int i=u+1;i<=n;i++){//找到可以匹配的另外点if(vis[i])continue;//是否已经被匹配vis[u]=1;vis[i]=1;dfs(u+1,sum+a[u][i]);//找下一组匹配点,之所以不从i+1开始递归是因为中间的点也可以和别的点配对的vis[u]=0;vis[i]=0;//回溯}
}

完整代码: 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,ans,a[18][18],vis[18];
void dfs(ll u,ll sum){//u是层数,sum和当前权值和。没有必要去重,重复就重复吧ans=max(ans,sum);//处理一次获取一次答案,没必要全部选完后再获取答案if(u==n+1)return ;//处理越界:因为下一句就是无条件dfsdfs(u+1,sum);//这是当前点不选对应的情况,因为我们题上可能会给出奇数点,必然有个点选不上if(vis[u]) return ;for(int i=u+1;i<=n;i++){//找到可以匹配的另外点if(vis[i])continue;//是否已经被匹配vis[u]=1;vis[i]=1;dfs(u+1,sum+a[u][i]);//找下一组匹配点,之所以不从i+1开始递归是因为中间的点也可以和别的点配对的vis[u]=0;vis[i]=0;//回溯}
}
int main(){cin>>n;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){cin>>a[i][j];}}dfs(1,0);cout<<ans;
}

注意dfs要一次处理一层,处理两层的话,遇到奇数层就会很麻烦 

// 请欣赏我的shit代码     千万不要学
void dfs(int u,int cnt){//dfs要一次处理一层,一次处理两层的话,万一一共奇数层怎么办ans=max(ans,cnt);if(u==n+1)return ;int t=1;while(vis[t])t++;for(int i=t;i<=n;i++){if(vis[i])continue;vis[i]=1;for(int j=i+1;j<=n;j++){if(vis[j])continue;vis[j]=1;dfs(u=1,cnt+a[i][j]);vis[j]=0;	}vis[i]=0;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3-44-Pinia- 安装步骤

介绍 本文介绍 在 vue3 中 安装 Pinia 的步骤 安装步骤 1、npm 安装 npm install pinia》 安装完成后可以看到 package.json 中添加了 pinia 的依赖信息 2、main.ts 中配置 // 引入 vue实例创建方法 import { createApp } from vue// 引入pinia import { createPinia } fro…

1. Logback介绍

Logback介绍 Logback旨在成为流行的log4j项目的继任者。它由Ceki Glc设计&#xff0c;他是log4j的创始人。它基于十年在设计工业级日志系统方 面的经验。结果产品&#xff0c;即logback&#xff0c;比所有现有的日志系统更快&#xff0c;具有更小的占用空间&#xff0c;有时差距…

C++ Web框架Drogon初体验笔记

这段时间研究了一下C的Web框架Drogon。从设计原理上面来说和Python的Web框架是大同小异的&#xff0c;但是难点在于编译项目上面&#xff0c;所以现在记录一下编译的过程。下面图是我项目的目录。其中include放的是头文件&#xff0c;src放的是视图文件&#xff0c;static放的是…

函数战争(栈帧)之创建与销毁(c语言)(vs2022)

首先&#xff0c;什么是函数栈帧&#xff1f; C语言中&#xff0c;每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录&#xff0c;是编译器用来实现过程函数调用的一种数据结构。 以问答的方式解释编译器与解释器-CSDN博客htt…

了解ASP.NET Core 中的文件提供程序

写在前面 ASP.NET Core 通过文件提供程序来抽象化文件系统访问。分为物理文件提供程序(PhysicalFileProvider)和清单嵌入的文件提供程序(ManifestEmbeddedFileProvider)还有复合文件提供程序(CompositeFileProvider )&#xff1b;其中PhysicalFileProvider 提供对物理文件系统…

Hyperledger Fabric Peer 配置解析

文中使用的 fabric 版本为 2.4.1 在 Fabric 网络中&#xff0c;用户可以设定 Peer 节点、排序节点、CA 节点的行为&#xff0c;以及管理通道、组织身份等多种资源&#xff0c;这都涉及网络内配置。 Fabric 节点在启动时可通过加载本地配置文件或环境变量等方式获取配置信息&am…

智数融合|低代码入局,推动工业数字化转型走"深"向"实"

当下&#xff0c;“数字化、智能化”已经不再是新鲜词汇。事实上&#xff0c;早在几年前&#xff0c;就有企业开始大力推动数字化转型&#xff0c;并持续进行了一段时间。一些业内人士甚至认为&#xff0c;“如今的企业数字化已经走过了成熟期&#xff0c;进入了深水区。” 但事…

加密流量分析的过程

1. 流量收集 什么是流量收集 流量采集是指在计算机网络中收集和记录网络流量数据的过程。这一过程通常由网络管理员、安全专业人员、网络分析师或研究人员使用特定工具和技术来执行。流量采集对于理解网络性能、进行故障排除、进行安全监控和进行网络分析都非常重要。 流量收…

【算法Hot100系列】下一个排列

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

java字符串常用方法day02

StringBuilder类 由于String是不变对象,每次修改内容都要创建新对象,因此String不适合做频繁修改操作.为了解决这个问题,java提供了StringBuilder类. package string;/*** 频繁修改字符串带来的性能损耗.*/ public class StringDemo2 {public static void main(String[] args…

openGauss系新增市场份额达21.9%,跨越生态拐点

[中国&#xff0c;北京&#xff0c;2023年12月28日] 以“汇聚数据库创新力量&#xff0c;打造千行万业数据基石”为主题的openGauss Summit 2023在北京望京凯悦酒店举办。本次大会由国家工业信息安全发展研究中心软件所、中国软件行业协会、中国计算机学会数据库专业委员会指导…

DDL关于数据库和表操作的语法

1. DDL-数据库操作 &#xff08;1&#xff09;SHOW DATABASES ; (查看当前有哪些数据库 &#xff08;2&#xff09;CREATE DATABASES 数据库名; (创建数据库的语法 &#xff08;3&#xff09;USE 数据库名; (切换到某个数据库 &#xff08;4&#xff09;SEL…

safari缓存清理

safari缓存清理 点击顶端Safari浏览器–>点击偏好设置 点击隐私–>管理网站数据 全部移除

python系列教程218——生成器表达式

朋友们&#xff0c;如需转载请标明出处&#xff1a;https://blog.csdn.net/jiangjunshow 声明&#xff1a;在人工智能技术教学期间&#xff0c;不少学生向我提一些python相关的问题&#xff0c;所以为了让同学们掌握更多扩展知识更好地理解AI技术&#xff0c;我让助理负责分享…

python筛选数据库中表的数量

import pymysqldb pymysql.connect(host,port,user,password) cursor db.cursor()def get_table_list(in_db, in_table_name):"""获取数据库中的表数量"""sql fshow tables from {in_db};cursor.execute(sql)data cursor.fetchall()table_li…

C++qt-信号-信号槽

1、概念 信号和槽是两种函数&#xff0c;这是Qt在C基础上新增的特性&#xff0c;类似于其他技术中的回调的概念。 信号和槽通过程序员提前设定的“约定”&#xff0c;可以实现对象之间的通信&#xff0c;有两个先决的条件&#xff1a; 通信的对象必须都是从QObject类中派生出来…

3.C语言:函数与程序结构

Function 函数定义与声明外部变量与作用域头文件静态变量static寄存器变量程序块结构&#xff08;作用域&#xff09;初始化递归C预处理器 函数定义与声明 函数定义形式&#xff1a; 返回值类型函数明(参数声明表) {声明和语句 }函数定义中的各构成部分都可以省略。 不执行任…

数据库开发工具Navicat Premium 15 mac软件特色

Navicat Premium 15 mac版是一款数据库开发工具&#xff0c;Navicat Premium 15 Mac版可以让你以单一程序同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。 Navicat Premium mac软件特色 无缝数据迁移 数据传输&#xff0c;数据同步和结构同步…

婚恋/社交娱乐/同城相亲/红娘相亲交友软件开发小程序

需求分析&#xff1a;首先明确小程序的目标、功能和用户需求。确定小程序的主要功能&#xff0c;例如用户注册、登录、个人资料编辑、浏览其他用户资料、发送消息等。 技术选型&#xff1a;选择适合的开发框架和技术工具。在小程序开发中&#xff0c;可以使用微信小程序原生开…

电脑开启虚拟化如何查看自己的主机主板型号

问题描述 在使用virtualbox、vmware安装虚拟机的时候&#xff0c;需要本机电脑能够支持虚拟化。 但是不同厂家的主机&#xff08;主板&#xff09;幸好并不一致&#xff0c;所以需要先了解自己的电脑主板型号 操作方法 1、win r 键打开运行窗口&#xff0c;输入cmd并确定打开…