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

news/2023/6/9 18:17:04

目录

  • 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=1sum连通块\sum_{i=1}^{sum_{连通块}}i=1sum连通块 cnti∗cnticnt_i*cnt_icnticnti
如果地图有炸弹,如果所有炸弹都在连通块xxx内,则ans=cntx∗cntxcnt_x*cnt_xcntxcntx
否则不存在,因为图并不联通,所以没有办法全部下蛋。

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.exyb.cn/news/show-4554515.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

后互联网:无聊已死、社交危机、故事崛起

李少加• 2017-08-30 • 社交互联网本身是一种全新中立的技术工具&#xff0c;由于上述影响&#xff0c;它让牛人更牛&#xff0c;也让蠢人更蠢。 本文来自微信公众号“少加点班”&#xff08;ID&#xff1a;lishaojia2015&#xff09;&#xff0c;作者李少加&#xff0c;《进化…

Mac新手使用技巧——Mac如何强制关机

一般情况下,Mac电脑是非常稳定的&#xff0c;但是偶尔也会碰到应用程序没有响应或死机的情况&#xff0c;那么我们需要强制关机&#xff0c;Mac如何强制关机呢&#xff1f;一起来看看吧&#xff01; 1.如果是电脑打开了太多的应用程序造成了没有响应&#xff0c;可以按CommandQ…

Mac电脑选择系统菜单中的关机或重启无法关机或重启,只能通过按电源键关机以及打开应用经常卡死问题及解决方案

昨天我遇到Mac电脑选择系统菜单栏的重启无法重启&#xff0c;选择系统菜单栏的关机也没有反应。把所有的应用都关闭也不行。只能通过按电源键关机。电脑开机后打开xcode或iterm都卡死经常启动不起来。 解决方案&#xff1a; 打开启动台->选择其它->选择活动监视器->选…

Python中的递归及案例演示

目录 一.什么是递归 二.案例 递归找文件 步骤 os模块中的三个方法 演示 最终代码 三.总结 一.什么是递归 递归在编程中是一种非常重要的算法 递归:即方法(函数)自己调用自己的一种特殊编程写法 如&#xff1a; 函数调用自己&#xff0c;即称之为递归调用。 二.案例 递…

黑苹果强制关机导致硬盘挂在失败问题

问题是黑苹果在使用过程中出现卡死的现象&#xff0c;只能强行关机&#xff0c;关机前百度云在下载文件&#xff0c;重新进入Mac系统后发现百度云无法下载&#xff0c;提示原因是文件创建失败&#xff0c;去finder下发现找不到以前的磁盘&#xff0c;在Mac的磁盘管理里能发现那…

Mac虚拟机VMware Fusion如何强制关机虚拟系统

Mac虚拟机VMware Fusion如何强制关机虚拟系统 分步阅读 本教程演示VMware Fusion虚拟机如何强制关机虚拟win系统 工具/原料 VMware Fusion虚拟机软件 方法/步骤 当使用虚拟机的是&#xff0c;有时候会遇到win系统死机&#xff0c;卡死等情况 首先点击屏幕顶部工具栏上的“虚拟…

计算机加域成灰色,win7系统创建域选项变成灰色的解决方法

win7系统使用久了&#xff0c;好多网友反馈说win7系统创建域选项变成灰色的问题&#xff0c;非常不方便。有什么办法可以永久解决win7系统创建域选项变成灰色的问题&#xff0c;面对win7系统创建域选项变成灰色故障问题&#xff0c;我们只需要1、在桌面按住windowsR调出运行,在…

计算机用户帐户域怎么查找,win7计算机域怎么查?小编教你查看计算机域、工作机组的方法...

win7计算机域怎么查&#xff1f;当我们在同一个工作机组的情况下我们可以互相访问传输文件&#xff0c;非常方便。但是有的用户的工作机组或者域不同导致无法正常使用局域网的现象&#xff0c;这个时候我们就可以通过查看这些计算机使用的域工作机组是否一致。在“域”模式下&a…