2019ICPC南京站

A

A Hard Problem

题意:给定一个正整数 n ,你需要找出最小整数 k,满足:从{1,2,⋯,n}中任意选择长度为k的子集,存在两个不同的整数 u,v∈T, 且 u 是 v 的因数。

思路:打表找规律 k = \left \lceil n/2 \right \rceil + 1

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e8+10;
const int inf=0x3f3f3f3f;using namespace std;void solve()
{int n;cin>>n;cout<<(n+3)/2<<'\n';
}
signed main()
{//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);ios;// get();// cout<<cnt<<'\n';int _t=1;cin>>_t;while(_t--) solve();system("pause");return 0;
}

C

Digital Path

题意:给定一个n*m的数字矩阵,从入度为0的点出发,每次操作只能向上下左右且增值为1的格子移动,终点为出度为0的点。求长度大于等于4的路径个数。

思路:先算出每个点的出度入度,从入度为0的开始bfs,更新方案数。

f[i][j][x]表示到达点(i, j)路径长度为x的方案数,特别的f[i][j][4]表示到达点(i, j)路径长度大于等于4的方案数。更新方式如下:

f[nx][ny][2] += f[x][y][1]

f[nx][ny][3] += f[x][y][2]

f[nx][ny][4] += f[x][y][3] + f[x][y][4]

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>typedef long long ll;
const int N=1010;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
using namespace std;
int n,m;
int a[N][N];
int in[N][N],out[N][N];
int f[N][N][5];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
void bfs()
{queue<pair<int,int>>q;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(in[i][j]==0) {q.push({i,j});f[i][j][1]=1;}while(q.size()){int x=q.front().first,y=q.front().second;q.pop();for(int k=0;k<4;k++){int nx=x+dir[k][0],ny=y+dir[k][1];if(nx<1||nx>n||ny<1||ny>m) continue;if(a[nx][ny]==a[x][y]+1){f[nx][ny][2]=(f[nx][ny][2]%mod+f[x][y][1])%mod;f[nx][ny][3]=(f[nx][ny][3]%mod+f[x][y][2])%mod;f[nx][ny][4]=((f[nx][ny][4]%mod+f[x][y][3]%mod)%mod+f[x][y][4]%mod)%mod;in[nx][ny]--; if(in[nx][ny]==0) q.push({nx,ny});}}}
}
void solve()
{cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int k=0;k<4;k++){int nx=i+dir[k][0],ny=j+dir[k][1];if(nx<1||nx>n||ny<1||ny>m) continue;if(a[nx][ny]==a[i][j]+1) out[i][j]++;else if(a[nx][ny]==a[i][j]-1) in[i][j]++;}bfs();int ans=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(out[i][j]==0) ans=(ans%mod+f[i][j][4])%mod;cout<<ans<<'\n';
}
signed main()
{//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);ios;int _t=1;//cin>>_t;while(_t--) solve();system("pause");return 0;
}

H

Prince and Princess

题意:

有n个房间,每个房间有一个人,他们知道任一个人在哪个房间,其中公主在某一房间.你可以问任一房间的人下列三个问题之一:①你是谁;②某个房间里的人是谁;③公主在哪个房间.

这n个人可分为三类,说真话、说假话、可能说真话也可能说假话,分别有a , b , c( 0 < a , b , c < 2e5 )人.至少问几次才能确定公主在哪个房间.若无法确定,输出"NO";若可以确定,输出"YES",下一行输出最小询问次数.

思路:考虑最坏情况,开始问的(b+c)个人都说假话,都回答错误答案A,再接着问(b+c)个人都说真话,都回答答案B,此时两个答案选择人数相同;再多问一个人,就可以区分出哪个是真话。所以至少需要问a+b+a+b+1=2(a+b)+1次,当总人数a+b+c >= 2(b+c)+1时,即a>=b+c+1时,输出YES。注意需要特判a=1 b=0 c=0时,只有公主一人时不需要询问。

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;using namespace std;
int a,b,c;
void solve()
{cin>>a>>b>>c;if(b+c>=a) cout<<"NO\n";else {cout<<"YES\n";if(a==1&&b==0&&c==0) cout<<0<<'\n';else if(b==0&&c==0) cout<<1<<'\n';else cout<<2*(b+c)+1<<'\n';}
}
signed main()
{//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);ios;int _t=1;//cin>>_t;while(_t--) solve();system("pause");return 0;
}

K

Triangle

题意:给定三角形三个顶点的坐标,给定点p,在三角形上找一点q的坐标,使得pq可以平分三角形面积。若p点不在三角形上时输出-1.

思路:分类讨论,讨论p在哪条边上,更靠近边的哪个顶点,在对应的边上二分求点q

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
const double eps=1e-7;
using namespace std;
inline double sqr(double x){return x*x;}
int sgn(double x){if(fabs(x) < eps)return 0;if(x < 0)return -1;else return 1;
}struct Point{double x,y;Point(){}Point(double _x,double _y){x = _x;y = _y;}void input(){scanf("%lf%lf",&x,&y);}Point operator -(const Point &b)const{return Point(x-b.x,y-b.y);}//叉积double operator ^(const Point &b)const{return x*b.y - y*b.x;}//点积double operator *(const Point &b)const{return x*b.x + y*b.y;}//返回两点的距离double distance(Point p){return hypot(x-p.x,y-p.y);}Point operator +(const Point &b)const{return Point(x+b.x,y+b.y);}Point operator *(const double &k)const{return Point(x*k,y*k);}};struct Line{Point s,e;Line(){}Line(Point _s,Point _e){s = _s;e = _e;}// 点在线段上的判断bool pointonseg(Point p){return sgn((p-s)^(e-s)) == 0 && sgn((p-s)*(p-e)) <= 0;}};Point mid_(Point a, Point b)
{return (a+b)*0.5;
}double area(Point a, Point b, Point c)
{return fabs((b - a) ^ (c - a) * 0.5);
}void solve()
{Point a,b,c,p;Line ab,ac,bc;a.input();b.input();c.input();p.input();ab=Line(a,b);ac=Line(a,c);bc=Line(b,c);if(!ab.pointonseg(p)&&!ac.pointonseg(p)&&!bc.pointonseg(p)){printf("-1\n");}else{double s=area(a,b,c)/2;if(ab.pointonseg(p)){double dispa=p.distance(a);double dispb=p.distance(b);if(dispa<dispb){Point l=b,r=c;Point mid;int x=50;while(x--){mid=mid_(l,r);int ret=sgn(area(mid,p,b)-s);if(ret>0) r=mid;else if(ret<0) l=mid;else break;}printf("%.10f %.10f\n",mid.x,mid.y);}else{Point l=a,r=c;Point mid;int x=50;while(x--){mid=mid_(l,r);int ret=sgn(area(mid,p,a)-s);if(ret>0) r=mid;else if(ret<0) l=mid;else break;}printf("%.10f %.10f\n",mid.x,mid.y);}}else if(ac.pointonseg(p)){double dispa=p.distance(a);double dispc=p.distance(c);if(dispa<dispc){Point l=c,r=b;Point mid;int x=50;while(x--){mid=mid_(l,r);int ret=sgn(area(p,mid,c)-s);if(ret>0) r=mid;else if(ret<0) l=mid;else break;}printf("%.10f %.10f\n",mid.x,mid.y);}else{Point l=a,r=b;Point mid;int x=50;while(x--){mid=mid_(l,r);int ret=sgn(area(p,mid,a)-s);if(ret>0) r=mid;else if(ret<0) l=mid;else break;}printf("%.10f %.10f\n",mid.x,mid.y);}}else{double dispb=p.distance(b);double dispc=p.distance(c);if(dispb<dispc){Point l=c,r=a;Point mid;int x=50;while(x--){mid=mid_(l,r);int ret=sgn(area(p,mid,c)-s);if(ret>0) r=mid;else if(ret<0) l=mid;else break;}printf("%.10f %.10f\n",mid.x,mid.y);}else{Point l=b,r=a;Point mid;int x=50;while(x--){mid=mid_(l,r);int ret=sgn(area(p,mid,b)-s);if(ret>0) r=mid;else if(ret<0) l=mid;else break;}printf("%.10f %.10f\n",mid.x,mid.y);}}}
}
signed main()
{//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);ios;int _t=1;// cin>>_t;scanf("%d",&_t);while(_t--) solve();system("pause");return 0;
}

J

Spy

题意:给定n个敌人的力量值a[i],及击杀敌人获得的荣誉值p[i].给定你的第一队的力量值b[i],第二队的力量值c[i].需要将b[i]与c[j]一一配对后组成n只队伍d[],新的力量值为两人之和,d[]再与a[]随机战斗,每只队伍只能战斗一次,共n!种情况。若d[i]>a[i]我方获得荣誉值p[i].求可获得的荣誉的最大期望乘n的值,数据保证最大期望乘n后是整数

思路:把b[]和c[]当作二分图,边的权值为这对组合可以获得的荣誉值之和。然后进行KM算法,找到最大权值匹配即为答案。

#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0)
#define PII pair<int,int>
typedef long long ll;
const int N=410;
const int inf=0x3f3f3f3f;
const ll infll=1e15+7;
using namespace std;
int n;
ll a[N],p[N],b[N],c[N];
ll w[N][N];
ll la[N], lb[N], upd[N]; // 左、右部点的顶标
bool va[N], vb[N]; // 访问标记:是否在交错树中
ll match[N]; // 右部点匹配了哪一个左部点
ll last[N]; // 右部点在交错树中的上一个右部点,用于倒推得到交错路bool dfs(ll x, ll fa) 
{va[x] = 1;for(int y = 1; y <= n; y++){if(!vb[y]){if(la[x] + lb[y] == w[x][y]) { vb[y] = 1; last[y] = fa;if(!match[y] || dfs(match[y], y)) {match[y] = x;return true;}}else if(upd[y] > la[x] + lb[y] - w[x][y]) {upd[y] = la[x] + lb[y] - w[x][y];last[y] = fa;}}}return false;
}ll KM() 
{for(int i = 1; i <= n; i++) {la[i] = -infll;lb[i] = 0;for(int j = 1; j <= n; j++) la[i] = max(la[i], w[i][j]);}for(int i = 1; i <= n; i++) {memset(va, 0, sizeof(va));memset(vb, 0, sizeof(vb));for(int j = 1; j <= n; j++) upd[j] = infll;// 从右部点st匹配的左部点match[st]开始dfs,一开始假设有一条0-i的匹配int st = 0; match[0] = i;while(match[st]) 	// 当到达一个非匹配点st时停止{ ll delta = infll;if(dfs(match[st], st)) break;for(int j = 1; j <= n; j++)if(!vb[j] && delta > upd[j]) {delta = upd[j];st = j; 		// 下一次直接从最小边开始DFS}for(int j = 1; j <= n; j++)  // 修改顶标{if(va[j]) la[j] -= delta;if(vb[j]) lb[j] += delta; else upd[j] -= delta;}vb[st] = true;}while(st)	// 倒推更新增广路 { match[st] = match[last[st]];st = last[st];}}ll ans = 0;for(int i = 1; i <= n; i++) if(match[i]) ans += w[match[i]][i];return ans;
}void solve()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>p[i];for(int i=1;i<=n;i++) cin>>b[i];for(int i=1;i<=n;i++) cin>>c[i];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){ll sum=0;for(int k=1;k<=n;k++)if(b[i]+c[j]>a[k]) sum+=p[k];w[i][j]=sum;}cout<<KM()<<'\n';}
signed main()
{//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);ios;int _t=1;//cin>>_t;while(_t--) solve();system("pause");return 0;
}

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

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

相关文章

深入解析数据结构与算法之堆

文章目录 &#x1f966;引言&#xff1a;&#x1f966;什么是堆&#x1f966;大顶堆与小顶堆&#x1f9c4;大顶堆&#xff08;Max Heap&#xff09;&#x1f9c4;小顶堆&#xff08;Min Heap&#xff09; &#x1f966;堆的表示&#x1f9c4;数组表示&#xff1a;&#x1f9c4;…

ROS2串口通讯serial库(适用于humble版本)

要的串口操作的API介绍在这里&#xff1a;serial: serial::Serial Class Reference (wjwwood.io) 但是我们不是直接利用上面这个东西&#xff0c;而是使用的是根据这个改写的一个针对ros2的一个serial库&#xff0c;这个serial库是根据上面这个库改写来的&#xff0c;ros2的库在…

渗透测试高级技巧(一):分析验签与前端加密

“开局一个登录框” 在黑盒的安全测试的工作开始的时候&#xff0c;打开网站一般来说可能仅仅是一个登录框&#xff1b;很多时候这种系统往往都是自研或者一些业务公司专门研发。最基础的情况下&#xff0c;我们会尝试使用 SQL 注入绕过或者爆破之类的常规手段&#xff0c;如果…

【STM32】TF卡FTA32文件系统

一、SD卡介绍 1.SD简介 本质&#xff1a;NandFlash控制芯片 2.SD卡存储容量等级 3.FAT文件系统的使用 4.SD卡速度等级 5.SD卡驱动方式 1.SDIO&&SD 1&#xff09;SDIO接口通信线&#xff1a;CLK/CMD/DAT0-3&#xff08;数据传输线4根&#xff09; 2&#xff09;SPI接口…

CodeWhisperer 一款好玩的 AI 插件

忙里抽闲&#xff0c;今天试了试 CodeWhisperer 这款插件&#xff0c;我是在 IDEA 中做的测试&#xff0c;下面是我的一些使用感想&#xff1a; 安装 CodeWhisperer 插件&#xff1a;在 IntelliJ IDEA 中&#xff0c;可以通过插件管理器安装 CodeWhisperer 插件&#xff0c;然…

基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管

一、TM4C123GH6NMRT7R IC MCU 32BIT 256KB FLASH 157BGA Tiva™C系列微控制器为设计人员提供了基于ARMCortex™-M的高性能架构&#xff0c;该架构具有广泛的集成功能以及强大的软件和开发工具生态系统。以性能和灵活性为目标&#xff0c;Tiva™C系列架构提供了一个具有FPU的80…

汽车托运汽车会产生公里数吗?

汽车托运&#xff0c;顾名思义就是把汽车放在板车上进行托运&#xff0c;既然是被托运&#xff0c;那为什么还会产生公里数呢?是被司机私用了吗?还是被当成租赁工具租借出去了呢? 其实不然&#xff0c;回到托运流程里&#xff0c;特别是大板车&#xff0c;我们的线路有很多需…

Redis(事务和持久化)(很重要!)

事务的定义&#xff1a; Redis中的事务是指一组命令的集合&#xff0c;这些命令可以在一个原子操作中执行。在Redis中&#xff0c;可以使用MULTI命令开始一个事务&#xff0c;然后使用EXEC命令来执行事务中的所有命令&#xff0c;或者使用DISCARD命令来取消事务。事务可以确保…

ERP对接淘宝/天猫/京东/拼多多商品详情数据API接口

引言 今天&#xff0c;我们时代变化非常快&#xff0c;传统行业做法&#xff0c;已经无法完全适应时代的发展。互联网的发展&#xff0c;造成了一股网购热。京东&#xff0c;天猫&#xff0c;淘宝&#xff0c;易购……网购&#xff0c;给我们生活带来了方便&#xff0c;消费者…

亚马逊第二个大语言模型 Olympus 即将上线

据外媒爆料&#xff0c;亚马逊正在训练他的第二个大语言模型——Olympus&#xff0c;很有可能在今年12月份上线。亚马逊计划将Olympus接入在线零售商店、Echo等设备上的Alexa语音助手&#xff0c;并为AWS平台提供新的功能。据说这个大语言模型规模达到2万亿&#xff08;2000B&a…

排序算法--冒泡排序

实现逻辑 ① 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 ②对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。在这一点&#xff0c;最后的元素应该会是最大的数。 ③针对所有的元素重复以上的步骤&#xff0c;除了最后一个。 ④…

java+springboot+bootstrap校园闲置物品拍卖交易平台_ngad7-

根据日常实际需要&#xff0c;一方面需要在系统中实现基础信息的管理&#xff0c;同时还需要结合实际情况的需要&#xff0c;提供校园闲置物品交易管理功能&#xff0c;方便校园闲置物品交易管理工作的展开&#xff0c;综合考虑&#xff0c;本套系统应该满足如下要求&#xff1…

Navicat DML 操作

在表格种插入 列信息 -- 修改数据 update 表名 set 列名 值1, 列名值2,[where 条件]; -- 注意&#xff1a;如果update语句没有加where 表里对应行的全部信息都会被改; -- 删除数据 delecte from 表名 [where 条件]; 未删除前&#xff1a; 执行删除后为&#xff1a; DQL - 条…

Apache Hive源码阅读环境搭建

前置软件&#xff1a; JDK 1.8 Maven 3.3.9 1 下载源码 # 下载源码 git clone https://github.com/apache/hive.gitcd hive# 查看标签 git tag# 切换到要阅读的指定版本的tag git checkout rel/release-2.1.02 编译源码 mvn clean install -DskipTests执行报错 日志如下 E…

Java精品项目源码基于SpringBoot的樱花短视频平台(v66)

Java精品项目源码基于SpringBoot的樱花短视频平台(v66) 大家好&#xff0c;小辰今天给大家介绍一个樱花短视频平台&#xff0c;演示视频公众号&#xff08;小辰哥的Java&#xff09;对号查询观看即可 文章目录 Java精品项目源码基于SpringBoot的樱花短视频平台(v66)难度指数&…

基础课8——中文分词

中文分词指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中&#xff0c;单词之间是以空格作为自然分界符的&#xff0c;而中文只是字、句和段能通过明显的分界符来简单划界&#xff0c;唯独词没有一个…

[vxe-table] expandAll:true 当table数据更新后无法展开,只有第一次能展开才能生效的问题

:tree-config"{rowField: id,parentField: parentId,expandAll: true,reserve: true, }" :row-config"{ keyField: id, isHover: true }"参考&#xff1a; vxe tree expandAll&#xff1a;true当table数据更新后无法展开&#xff0c;只有第一次能展开才能…

go-zero微服务的使用

一、入门案例 1、使用goland创建一个工程 2、新建一个user.proto syntax "proto3";package user; // 这个地方表示生成的go的包名叫user option go_package "./user";message UserInfoRequest {int64 userId 1; }message UserInfoResponse {int64 user…

SwiftUI 如何动态开始和停止播放永久重复(repeatForever)动画

0. 功能需求 在 SwiftUI 丰富多彩的动画世界中,我们有时希望可以随意开始和停止永久循环(repeatForever)的动画,不过这时往往会产生错误的动画“叠加”效果。 从上图可以看到:虽然我们希望密码输入框背景只在用户输入密码时才发生闪烁,但顶部的密码输入框随着不断输入其…

Speech | openSMILE语音特征提取工具

官方地址&#xff1a;openSMILE 3.0 - audEERING 使用指导&#xff1a;openSMILE — openSMILE Documentation (audeering.github.io) openSMILE 简介 openSMILE是一款以命令行形式运行的工具&#xff0c;通过配置config文件来提取音频特征。主要应用于语音识别、情感计算、音…