【题解】2023牛客寒假算法基础集训营1

news2024/9/22 9:50:25

目录

  • A. World Final? World Cup! (I)
    • 思路
  • B. World Final? World Cup! (II)
  • C. 现在是,学术时间 (I)
    • 思路
  • D. 现在是,学术时间 (II)
    • 思路
  • E. 鸡算几何
    • 思路
  • F. 鸡玩炸蛋人
    • 思路
  • G. 鸡格线
    • 思路
  • H. 本题主要考察了DFS
    • 思路
  • I. 本题也主要考察了DFS
  • J. 本题竟也主要考察了DFS
  • K. 本题主要考察了dp
    • 思路
  • L. 本题主要考察了运气
    • 思路
  • M. 本题主要考察了找规律
    • 思路

A. World Final? World Cup! (I)

思路

tag:枚举
暴力枚举,判断当前剩余场次是否足够翻盘,如果满足则继续枚举,不满足则直接break输出当前场次

void solve()
{
    string s;
    cin>>s;
    s='#'+s;
    int n=10;
    int a=0,b=0;
    rep(i,1,n)
    {
        if(i%2)
        {
            if(s[i]=='1')a++;
        }
        else
        {
            if(s[i]=='1')b++;
        }
        int x=0,y=0;
        rep(j,i+1,n)
            if(j%2)x++;
            else y++;
        if(a>b+y)
        {
            cout<<i<<endl;
            return;
        }
        if(b>a+x)
        {
            cout<<i<<endl;
            return;
        }
    }
    if(a==b)cout<<-1<<endl;
}

B. World Final? World Cup! (II)

待补。。。

C. 现在是,学术时间 (I)

思路

tag:思维,诈骗
至少H篇论文的引用大于等于H,所以一篇论文最大贡献也是1,考虑论文数和人数一样,每个人分配一篇论文就好了,记录0的个数。

int n;
const int N=1e5+10;
int a[N];
void solve()
{
    int s=0;
    cin>>n;
    rep(i,1,n)cin>>a[i],s+=a[i]==0;
    cout<<n-s<<endl;
}

D. 现在是,学术时间 (II)

思路

tag:几何计算,暴力
我写的比较麻烦,分成了九个部分分别枚举不同情况求解,分子分母同时加一个数越接近整数1,所以尽可能选取大的面积,求出来的IOU就尽可能大。数学证明就不证了。

void solve()
{
    int x,y,xp,yp;
    scanf("%lld%lld%lld%lld",&x,&y,&xp,&yp);
    lb res=0;
    int maxx=0,maxy=0;
    if(xp>=0&&xp<=x&&yp>=0&&yp<=y)
    {
        maxx=max(xp,abs(x-xp));
        maxy=max(yp,abs(y-yp));
        res=maxx*maxy*1.0/(x*y);
    }
    else if(xp>x&&yp<=y&&yp>=0)
    {
        maxx=xp;
        maxy=max(abs(0-yp),abs(y-yp));
        lb area1=x*maxy;
        lb area2=x*y+(xp-x)*maxy;
        res=area1/area2;
    }
    else if(xp>x&&yp>y)
    {
        maxx=xp;
        maxy=yp;
        lb area1=x*y;
        lb area2=xp*yp;
        res=area1/area2;
    }
    else if(xp>x&&yp<0)
    {
        maxx=xp;
        maxy=y-yp;
        lb area1=x*y;
        lb area2=maxx*maxy;
        res=area1/area2;
    }
    else if(xp<0&&yp<=y&&yp>=0)
    {
        maxx=x-xp;
        maxy=max(abs(0-yp),abs(y-yp));
        lb area1=x*maxy;
        lb area2=x*y+(-xp*maxy);
        res=area1/area2;
    }
    else if(xp<0&&yp>y)
    {
        maxx=x-xp;
        maxy=yp;
        lb area1=x*y;
        lb area2=maxx*maxy;
        res=area1/area2;
    }
    else if(xp<0&&yp<y)
    {
        maxx=x-xp;
        maxy=y-yp;
        lb area1=x*y;
        lb area2=maxx*maxy;
        res=area1/area2;
    }
    else if(xp>=0&&xp<=x&&yp<0)
    {
        maxx=max(xp,abs(x-xp));
        maxy=-yp+y;
        lb area1=maxx*y;
        lb area2=x*y+(maxx*(-yp));
        res=area1/area2;
    }
    else if(xp>=0&&xp<=x&&yp>0)
    {
        maxx=max(xp,abs(x-xp));
        maxy=yp;
        lb area1=y*maxx;
        lb area2=x*y+maxx*(yp-y);
        res=area1/area2;
    }
    printf("%.9Lf\n",res);
}

E. 鸡算几何

思路

tag:几何,to_left
判断是否进行了反转操作,判断叉积的正负。
几何意义:向量A与B张成的平行四边形的有向面积。B在A的逆时针方向为正。
求出两个斜边的叉积判断正负符号是否相同即可。

double len(PDD a)
{
    return a.x*a.x+a.y*a.y;
}
double to_left(PDD a,PDD b)
{
    return a.x*b.y-a.y*b.x;
}
PDD a,b,c,d,e,f;
PII ba,bc;
PDD ed,ef;
void solve()
{
    cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y;
    cin>>d.x>>d.y>>e.x>>e.y>>f.x>>f.y;
    ba={a.x-b.x,a.y-b.y},bc={c.x-b.x,c.y-b.y};
    if(len(ba)==len(bc))
    {
        NO;
        return;
    }
    ed={d.x-e.x,d.y-e.y},ef={f.x-e.x,f.y-e.y};
    if(fabs(len(ed)-len(bc))<eps)swap(ba,bc);
    int c1=to_left(ba,bc);
    double c2=to_left(ed,ef);
    if(c1*c2<0)YES;
    else NO;
}

F. 鸡玩炸蛋人

思路

tag:并查集,思维,诈骗
如果整个地图没有炸弹,那么每个连通块的每个点都可以取起点和终点,则ans= ∑ i = 1 s u m 连通块 \sum_{i=1}^{sum_{连通块}} i=1sum连通块 c n t i ∗ c n t i cnt_i*cnt_i cnticnti
如果地图有炸弹,如果所有炸弹都在连通块 x x x内,则ans= c n t x ∗ c n t x cnt_x*cnt_x cntxcntx
否则不存在,因为图并不联通,所以没有办法全部下蛋。

int n,m;
const int N=2e5+10;
int f[N],cnt[N],s[N];
int find(int x)
{
	if(x!=f[x])f[x]=find(f[x]);
	return f[x];
}
void unite(int a,int b)
{
	a=find(a),b=find(b);
	if(a!=b)
	{
		f[b]=a;
		cnt[a]+=cnt[b];
		s[a]+=s[b];
	}
}
void solve()
{
	cin>>n>>m;
	rep(i,1,n)f[i]=i,cnt[i]=1;
	vector<PII>v;
	rep(i,1,m)
	{
		int a,b;
		cin>>a>>b;
		v.pb({a,b});
	}
	int sum=0;
	rep(i,1,n)cin>>s[i],sum+=s[i];
	rep(i,0,m-1)
		unite(v[i].x,v[i].y);
	int res=0;
	if(sum==0)
	{
		rep(i,1,n)
			if(find(i)==i)
				res+=cnt[i]*cnt[i];
	}
	else
	{
		rep(i,1,n)
			if(find(i)==i)
				if(s[i]==sum)
				{
					res=cnt[i]*cnt[i];
					break;
				}
	}
	cout<<res<<endl;
}

G. 鸡格线

思路

tag:STL+打表找规律
在这里插入图片描述

这题难在发现规律,打表不难发现,该数列分别收敛于0,99,100
那么做法就有很多了,我写了线段树和mp+二分的写法。

int n,m;
const int N=1e5+10;
int a[N];
struct node 
{
    int l,r;
    int sum;
    bool f;
}tr[4*N];
void up(int u)
{
    tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
    tr[u].f=tr[u<<1].f&tr[u<<1|1].f;
}
void build(int u,int l,int r)
{
    tr[u]={l,r};
    if(l==r)
    {
        tr[u].sum=a[l];
        return;
    }
    int mid=tr[u].l+tr[u].r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    up(u);
}
void modify(int u,int l,int r,int k)
{
    if(tr[u].f)return;
    if(tr[u].l==tr[u].r)
    {
        for(int i=1;i<=k;i++)
        {
            int t=tr[u].sum;
            tr[u].sum=round(10*sqrtl(tr[u].sum));
            if(t==tr[u].sum)
            {
                tr[u].f=true;
                break;
            }
        }
    }
    else
    {
        int mid=tr[u].l+tr[u].r>>1;
        if(l<=mid)modify(u<<1,l,r,k);
        if(r>mid)modify(u<<1|1,l,r,k);
        up(u);
    }
}
void solve()
{
    cin>>n>>m;
    rep(i,1,n)cin>>a[i];
    build(1,1,n);
    rep(i,1,m)
    {
        int op;cin>>op;
        if(op==1)
        {
            int l,r,k;
            cin>>l>>r>>k;
            modify(1,l,r,k);
        }
        else cout<<tr[1].sum<<endl;
    }
}
int n,m;
const int N=1e5+10;
int a[N];
map<int,int>mp;
void solve()
{
    cin>>n>>m;
    int res=0;
    rep(i,1,n)cin>>a[i],res+=a[i],mp[i]=a[i];
    mp[-1]=1,mp[n+1]=1;
    rep(i,1,m)
    {
        int op;cin>>op;
        if(op==2)cout<<res<<endl;
        else
        {
            int l,r,k;
            cin>>l>>r>>k;
            for(auto it=mp.lower_bound(l);it->x<=r;it++)
            {
                int x=it->x,&y=it->y;
                for(int j=1;j<=k;j++)
                {
                    int m=round(10*sqrtl(y));
                    res-=y;
                    res+=m;
                    if(y==m)
                    {
                        it=mp.erase(it);
                        it--;
                        break;
                    }
                    y=m;
                }
            }
        }
    }
}

H. 本题主要考察了DFS

思路

tag:思维,诈骗
多一块权值+1,少一块权值-1,所以直接用总面积减去已知面积即可。

int n;
void solve()
{
    cin>>n;
    string s;
    int res=n*n*10;
    rep(i,1,n*n-1)
    {
        cin>>s;
        int sum=10;
        rep(j,0,3)
        {
            if(s[j]=='1')sum--;
            else if(s[j]=='2')sum++;
        }
        //cout<<sum<<endl;
        res-=sum;
    }
    cout<<res<<endl;
}

I. 本题也主要考察了DFS

待补。。。

J. 本题竟也主要考察了DFS

待补。。。

K. 本题主要考察了dp

思路

tag:贪心,构造
凑出尽可能多的一个1两个0的子串,尽量让第一个1处于最左端,否则会浪费0,所以构造出100100111这种构造方案,然后暴力check即可

int n,m;
void solve()
{
    cin>>n>>m;
    int zero=n-m,one=m;
    vector<int>v;
    rep(i,1,n)
    {
        if(one)
        {
            int k=0;
            v.pb(1);one--;
            while(k<2&&zero)zero--,v.pb(0),k++;
        }
    }
    int res=0;
    for(int i=0;i+2<n;i++)
    {
        int j=i+2;
        int a=0,b=0;
        for(int k=i;k<=min(n-1,j);k++)
            if(v[k]==0)a++;
            else b++;
        if(b>a)res++;
    }
     
    cout<<res<<endl;
}

L. 本题主要考察了运气

思路

并没有思路(太菜了不会),从1到100试试运气把。

void solve()
{
    cout<<32<<endl;
}

M. 本题主要考察了找规律

思路

tag: dp
和背包差不多,多了每次枚举当前给了多少仙贝。

int n,m;
const int N=510;
lb f[N][N];
void solve()
{
    scanf("%lld%lld",&n,&m);
    rep(i,1,m)f[1][i]=1.0*i/m;
    rep(i,2,n)
    {
        rep(j,1,m)
        {
            rep(k,1,j)
            {
                f[i][j]=max(f[i][j],f[i-1][j-k]+1.0*k/(m-j+k));
            }
        }
    }
    lb res=0;
    rep(i,1,m)res=max(res,f[n][i]);
    printf("%.8Lf",res);
}

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

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

相关文章

MySQL详细教程,2023硬核学习路线,看这一篇就够了

文章目录前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL2. MySQL数据库2.1 MySQL安装2.2 MySQL配置2.2.1 添加环境变量2.2.2 新建配置文件2.2.3 初始化MySQL2.2.4 注册MySQL服务2.2.5 启动MySQL服务2.3 MySQL登录和退出2.4 MySQL卸载2.5 M…

PR基础知识

sh什么是帧&#xff0c;什么是帧速率&#xff0c;什么是方形像素? 什么叫场序? # 时长 s时i长为视频时间得长度&#xff0c;基本单位为秒。但是在PR软件中。有更为精准得时间单位计算为帧。也就是说把1秒分为若干份。一份就是一帧。一帧也就可以理解为一张图片。 s所以在PR…

联合证券|未来五年是“大信创”发展的关键时期 发展空间广阔

机构指出&#xff0c;展望2023年&#xff0c;信创将从党政信创走向全面信创&#xff08;28N&#xff09;&#xff0c;叠加方针催化及疫情预期转变&#xff0c;泛信创范畴有望成为板块主线&#xff0c;孕育出许多板块的出资机会。 中心逻辑 1、2022年计算机职业大都子板块的增长…

用户行为收集到HIVE

2.3 用户行为收集到HIVE 目标 目标 知道收集用户日志形式、流程知道flume收集相关配置、hive相关配置知道supervisor开启flume收集进程管理应用 应用supervisor管理flume实时收集点击日志 2.3.1 为什么要收集用户点击行为日志 用户行为对于某项目文章推荐来说&#xff0c;至…

京东方尚未成为苹果的最大供应商,但已经享受到果链的好处

在知名分析师郭明錤表示京东方今年将成为苹果iPhone15的OLED面板主力供应商后&#xff0c;业界纷纷期待京东方在中小尺寸OLED面板市场的份额激增&#xff0c;目前虽然京东方尚未真正开始向苹果供应iPhone15的OLED面板&#xff0c;但它已开始享受到果链带来的好处。京东方量产OL…

嵌入式C语言设计模式 --- 装饰器模式

1 - 什么是装饰器模式? 装饰器模式(Decorator Pattern),是结构型设计模式的一种,装饰器模式允许向一个现有的对象添加新的功能,而又不改变其对象结构,这种方式比使用子类继承的方式更加灵活。 装饰,顾名思义,就是在原有事物的基础上,锦上添花地新增某些点缀或功能,…

[ROS2 入门] rqt_console 使用介绍

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们一起了解ROS 2中“Actions ”概念&#xff0c;至此最基本的核心基础概念&#xff0c;我们就都分享介绍完毕了&…

③【Spring】整合第三框架的常用机制:FactoryBean

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ FactoryBean 机制一、什么是 FactoryBean &…

Linux:报错“command not found: yum”及yum和apt-get的区别

还是最近的工作总结&#xff0c;使用yum命令安装出现了报错&#xff0c;具体看下面 目录报错原因yum和apt-get的区别yumyum功能yum特点yum常用命令apt-getapt常用命令解决报错 使用命令安装 yum install sysstat结果报错 zsh&#xff1a;command not found: yum 印象中安装命…

Akamai 第三季度 DNS 威胁分析报告

Akamai 如期发布了 2022 年第三季度 DNS 威胁分析报告&#xff0c;基于其海量 DNS 数据对网络钓鱼等攻击威胁进行洞察。 攻击类别 在 2022 年第三季度&#xff0c;数据视野中 10.6% 的设备在季度内至少访问过一次与恶意软件相关的域名。另外&#xff0c;6.3% 的设备访问了钓鱼…

【蓝桥杯】历届真题 左hai子右兄弟(省赛)Java

【资源限制】 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 【问题描述】 对于一棵多叉树&#xff0c;我们可以通过 “左孩子右兄弟” 表示法&#xff0c;将其转化成一棵二叉树。 如果我们认…

leetcode_二叉树

二叉树二叉树理论基础二叉树的递归遍历二叉树的迭代遍历(统一写法&#xff1a;加空指针)二叉树的层序遍历迭代法二叉树的层序遍历II二叉树的右视图N叉树的层序遍历填充每个节点的下一个右侧节点指针二叉树的最大深度层序遍历法&#xff08;迭代&#xff09;后序遍历法&#xff…

SkyWalking全链路监控部署及使用分享

SkyWalking是一款开源的应用性能监控系统&#xff0c;对比阿里云ARMS&#xff0c;可以对应用进行全方位监控&#xff0c;帮助研发人员快速定位出错接口、慢接口、重现调用参数、发现系统瓶颈&#xff0c;从而大幅提升线上问题诊断的效率&#xff0c;本文向大家介绍了Skywalking…

用通知-等待机制优化锁等待问题

破坏占用且等待就可以避免死锁产生&#xff0c;以上一节中的循环等待代码来看&#xff1a; // 一次性申请转出账户和转入账户&#xff0c;直到成功 while(!actr.apply(this, target))&#xff1b;如果apply()操作耗时非常端&#xff0c;而且并发冲突量不大时&#xff0c;这个方…

新春限定:新红包封面项目

新春限定&#xff1a;红包封面项目项目系统流量系统项目系统 去看一下“微信红包封面”的微信指数&#xff1a; 这个指数越大&#xff0c;代表市场越大。 入局这个生意&#xff0c;不需要门槛。 注册红包封面网站&#xff1a;http://ozqxsct.hsenzy.com/ 要用夸克、Edge、…

正确清理mysql-bin

1. 背景 机器磁盘满导致mysql连接不上&#xff0c;删除部分日志&#xff0c;错误将mysql-bin.0050* 都删除&#xff0c;重启mysql失败 $ service mysqld start Starting MySQL.......... ERROR! The server quit without updating PID file (/data/mysqldata/gzqc249-243-214…

Linux diffstat命令

Linux diffstat命令根据diff的比较结果&#xff0c;显示统计数字。diffstat读取diff的输出结果&#xff0c;然后统计各文件的插入&#xff0c;删除&#xff0c;修改等差异计量。语法diff [-wV][-n <文件名长度>][-p <文件名长度>]参数&#xff1a;-n<文件名长度…

WPF 笔记1——分析WPF程序文件

看B站刘铁猛老师视频学习WPF 1、创建WPF项目 打开VS&#xff0c;新建一个WPF项目&#xff0c;文件结构如下图&#xff1a; 通常&#xff0c; xxx.xaml、 xxx.xaml.cs是一组文件&#xff0c;用来定义一个名称是xxx的类。 2、xxx.xaml文件剖析 <Window x:Class"WpfAp…

红黑树作业

简介本文是为操作系统作业而实现的红黑树源码。作业题目选题为&#xff1a;“(3)红黑树(rbtree)数据结构介绍及其在Linux内核中的应用(结合内核源码进行分析&#xff0c;内核版本号不低于2.6.0)”。因为网上太多红黑树原理的讲解了&#xff0c;不需要再去讲解原理&#xff0c;所…

Tokitsukaze and a+b=n (hard)(差分)

C-Tokitsukaze and abn (hard)_2023牛客寒假算法基础集训营2 (nowcoder.com) 题目描述 Tokitsukaze有一个整数n&#xff0c;以及m个区间[L, R]。 她想知道有多少种选法&#xff0c;满足:从m个区间中选择两个区间[L; R],[Lj;,R](i≠j)&#xff0c;并从第一个区间选择一个整数a(…