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

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

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

相关文章

微服务实战系列之加密RSA

前言 在这个时代&#xff0c;我们选择的人生目标已丰富多彩&#xff0c;秉持的人生态度也千差万别&#xff1a; 除了吃喝玩乐&#xff0c;还有科技探索&#xff1b; 除了CityWalk&#xff0c;还有“BookWalk”&#xff1b; 除了走遍中国&#xff0c;还有走遍世界&#xff1b; …

源码安装Apache

一、下载Apache,源码安装Apache #下载 [rootlocalhost opt]# wget -c https://mirrors.aliyun.com/apache/httpd/httpd-2.4.58.tar.gz [rootlocalhost opt]# ls httpd-2.4.58.tar.gz [rootlocalhost opt]# tar -xf httpd-2.4.58.tar.gz [rootlocalhost opt]# ls httpd-2.4.58…

怎么让NetCore接口支持Json参数

项目&#xff1a;NetCore Web API 接口支持Json参数需要安装Newtonsoft.Json.Linq和Microsoft.AspNetCore.Mvc.NewtonsoftJson Program代码 //支持json需要安装Microsoft.AspNetCore.Mvc.NewtonsoftJson using Newtonsoft.Json.Serialization;var builder WebApplication.Cr…

机器学习8:在病马数据集上进行算法比较(ROC曲线与AUC)

ROC曲线与AUC。使用不同的迭代次数&#xff08;基模型数量&#xff09;进行 Adaboost 模型训练&#xff0c;并记录每个模型的真阳性率和假阳性率&#xff0c;并绘制每个模型对应的 ROC 曲线&#xff0c;比较模型性能&#xff0c;输出 AUC 值最高的模型的迭代次数和 ROC 曲线。 …

力扣1038. 从二叉搜索树到更大和树(java,树的中序遍历解法)

Problem: 1038. 从二叉搜索树到更大和树 文章目录 题目描述思路解题方法复杂度Code 题目描述 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c; 二叉搜索树 满足下列约束条件&#xff…

ssh远程连接不了虚拟机ubuntu

直奔主题 1. 确保linux安装了ssh2.查看网络适配器是否启用3.连接成功 1. 确保linux安装了ssh sudo apt-get install openssh-server2.查看网络适配器是否启用 3.连接成功

高德地图点击搜索触发输入提示

减少调用次数&#xff0c;不用每输入一次调用一次&#xff0c;输入完后再触发搜索 效果图&#xff1a; ![Alt](https://img-home.csdnimg.cn/images/20220524100510.png dom结构 <div class"seach"><van-searchshow-actionv-model"addressVal"…

CentOS用nginx搭建文件下载服务器

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动。在工作中&#xff0c;我们经常会用到需要搭建文件服务器的情况&#xff0c;这里就以在linux下搭…

debian 12 配置

1. 修改apt源 修改apt源为http版本 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/d…

【SA8295P 源码分析】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算

【SA8295P 源码分析】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算 一、GPIO 透传带宽消耗计算二、SPI 通迅带宽消耗计算三、I2C 通迅带宽消耗计算四、UART 通迅带宽消耗计算系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链接…

【经验之谈·高频PCB电路设计常见的66个问题】

文章目录 1、如何选择PCB 板材&#xff1f;2、如何避免高频干扰&#xff1f;3、在高速设计中&#xff0c;如何解决信号的完整性问题&#xff1f;4、差分布线方式是如何实现的&#xff1f;5、对于只有一个输出端的时钟信号线&#xff0c;如何实现差分布线&#xff1f;6、接收端差…

安装向量数据库milvus及其Attu

前置条件安装docker compose 在宿主机上创建文件目录 mkdir -p /home/sunyuhua/milvus/db mkdir -p /home/sunyuhua/milvus/conf mkdir -p /home/sunyuhua/milvus/etcd下载docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.2.11/milvus-s…

www.testfire.nets渗透测试报告

www.testfire.nets渗透测试报告 一、测试综述 1.1.测试⽬的 通过实施针对性的渗透测试&#xff0c;发现testfire.net⽹站的安全漏洞&#xff0c;锻炼自己的渗透水平 1.2.测试范围 域名&#xff1a;www.testfire.net IP:65.61.137.117 测试时间&#xff1a; 2023年11月…

代码随想录算法训练营第23期day52|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

目录 一、300.最长递增子序列 二、674. 最长连续递增序列 三、718. 最长重复子数组 一、300.最长递增子序列 力扣题目链接 子序列是可以在不改变原有次序的情况下删除一些元素&#xff0c;需要进行二重遍历进行判断 class Solution { public:int lengthOfLIS(vector<in…

vue3的两个提示[Vue warn]: 关于组件渲染和函数外部使用

1. [Vue warn]: inject() can only be used inside setup() or functional components. 这个消息是提示我们&#xff0c;需要将引入的方法作为一个变量使用。以vue-store为例&#xff0c;如果我们按照如下的方式使用&#xff1a; import UseUserStore from ../../store/module…

平民如何体验一把大模型知识库

背景 随着openai发布的chatgpt,各界掀起大模型热. 微软、谷歌、百度、阿里等大厂纷纷拥抱人工智能, 表示人工智能将是下一个风口.确实, chatgpt的表现确实出乎大部分的意料之外,网上也不断流传出来,chatgpt未来会替换很多白领.作为一名普通的程序员,觉得非常有必要随波逐流一下…

2023/11/21JAVAweb学习

优先级高低id > 类 > 元素 格式化ctrl alt L

[羊城杯2020]easyphp .htaccess的利用

[CTF].htaccess的使用技巧总结 例题讲解 掌握知识&#xff1a; 测试发现是阿帕奇服务器&#xff0c;就想到上传文件利用.htaccess配置文件执行jpg文件中的php代码&#xff0c;但是再进行第二次文件写入时会把之前的文件删除掉&#xff0c;所以不能上传两次来利用&#xff0c…

VS搭建QT环境失败1

在VS中做一个简单QT控制台程序; 包含目录已经添加如下图;可以找到QCoreApplication头文件;可以找到QCoreApplication类,把鼠标放上去会有提示;但是由QCoreApplication类生成对象会出错;app这个变量提示出错; 同时显示200多个错误;这是VS2015; 看一下我的QT安装有没有缺…

虚拟机配置centos7网络

一、编辑虚拟网络 二、编辑 ifcfg-ens32 配置静态ip vim /etc/sysconfig/network-scripts/ifcfg-ens32 三、网卡设置 四、重启网络 systemctl restart network