2022-2-26 个人排位赛1

2023-10-20 17:59
文章标签 个人 2022 26 排位赛

本文主要是介绍2022-2-26 个人排位赛1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2022-2-26 个人排位赛1

A An (Almost) Perfect Match

没读,不知道

B Good Coin Denomination
题意

给定一个上升序列,问这个序列是否满足每个数都是前一个数的两倍多。
第一个输入,多组样例数,每行先输入这个上升序列的个数,再输入上升序列的每个数。

输入

2
4 1 5 10 25
3 1 5 6 

输出

Denominations: 1 5 10 25
Good coin denominations!Denominations: 1 5 6
Bad coin denominations! 
Solution

直接暴力比大小即可

代码
#include<bits/stdc++.h>
#define ls i<<1
#define rs i<<1|1
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int t;
int n;
int a[20],b[20];
int main()
{cin>>t;while(t--){cin>>n;bool flag=true;for(int i=0;i<n;i++){cin>>a[i];if(i>0){if(a[i]*1.0/a[i-1]<2)flag=false;}}cout<<"Denominations:";for(int i=0;i<n;i++)cout<<" "<<a[i];cout<<endl;if(flag)cout<<"Good coin denominations!"<<endl;else cout<<"Bad coin denominations!"<<endl;cout<<endl;}return 0;
}
C Cameron’s Crazy Circles
题意

多组样例 t,给定直角三角形的直角边 L1,L2,先在直角三角形内画一个内切圆,再在之后接连画圆,之后的这些圆都与斜边、前一个圆、一条直角边相切。问所有圆的面积和与三角形的比值是多少?

输入

2
3 4
12 16

输出

Case #1: 0.7171Case #2: 0.7171 
Solution

在这里插入图片描述

代码
#include<bits/stdc++.h>
#define ls i<<1
#define rs i<<1|1
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
#define INF 0x3f3f3f3f
const double pi=acos(-1);
int a,b;
int t;
int main()
{scanf("%d",&t);for(int cas=1;cas<=t;cas++){scanf("%d%d",&a,&b);double c=sqrt(a*a+b*b);double r=(a+b-c)/2.0;double degree=atan(1.0*a/b)/2.0;double h=(b-r)/cos(degree)-r;double r1=h*sin(degree)/(1+sin(degree));double h1=h-2*r1;double rate=pi*r1*r1/((h1+h)*tan(degree)*2*r1);double res=(pi*r*r+rate*(h*h*tan(degree)))/(a*b/2.0);printf("Case #%d: %.4f\n\n",cas,res);}return 0;
}
D Matrix Transformation
题意

给定一个 R × C R \times C R×C的矩阵,对其中任意相邻的两个值进行同时 加1 或 减1 操作(其中相邻值的是水平线上相邻或竖直线上相邻),问能否将整个矩阵的值变为0,。

输入

6
3 3
-2 2 2
1 1 0
2 -2 -2
3 3
-1 0 1
-2 -1 1
0 1 2
3 3
-1 0 1
0 2 -1
-1 1 2
3 3
-1 2 1
-1 -1 -3
1 1 -1
2 3
0 -2 3
1 3 1
2 3
3 1 1
2 0 1

输出

Case #1: YESCase #2: NOCase #3: NOCase #4: YESCase #5: NOCase #6: YES 
Solution

先对矩阵的每一行进行处理,将除最后一列外的所有值都通过加减1操作变为0。
再对最后一列进行处理,使除最后一行外的所有值都通过加减1操作变为0。
最后根据矩阵右下角的值的结果输出YES和NO。

代码
#include<bits/stdc++.h>
#define ls i<<1
#define rs i<<1|1
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int t;
int n,m;
int a[35][35];
int main()
{scanf("%d",&t);for(int cas=1;cas<=t;cas++){scanf("%d%d",&n,&m);for(int i=0;i<n;i++)for(int j=0;j<m;j++)scanf("%d",&a[i][j]);for(int i=0;i<n;i++){for(int j=1;j<m;j++)a[i][j]-=a[i][j-1];}for(int i=1;i<n;i++)a[i][m-1]-=a[i-1][m-1];if(a[n-1][m-1]==0)printf("Case #%d: YES\n",cas);else printf("Case #%d: NO\n",cas);printf("\n");}return 0;
}
E Cut the Cake!
题意

对一个蛋糕进行水平切开,将蛋糕分成两部分,问这两部分的周长分别为多少
多组样例,给定点数 V 和 水平线位置Y,逆时针给出所有点坐标。

输入

2
4 2
0 0
4 0
4 4
0 4
6 10
3 15
10 1
12 5
11 19
9 23
6 20

输出

Case #1: 12.000 12.000Case #2: 25.690 35.302
Solution

在这里插入图片描述

通过图可以看出来,跟多边形与水平线的交点对答案的贡献是要对所有交点的x坐标进行排序后,两个两个进行减法操作。
其余的周长都是根据线段在Y上还是Y下分开进行计算。

代码
#include<bits/stdc++.h>
#define ls i<<1
#define rs i<<1|1
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
#define INF 0x3f3f3f3f
int x[20],y[20];
double dis(double x1,double y1,double x2,double y2)
{return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
vector<double>e;
int main()
{int t;scanf("%d",&t);for(int cas=1;cas<=t;cas++){int n,k;scanf("%d%d",&n,&k);e.clear();double a=0,b=0;for(int i=0;i<n;i++){scanf("%d%d",&x[i],&y[i]);}x[n]=x[0];y[n]=y[0];for(int i=1;i<=n;i++){if((k-y[i-1])*(k-y[i])<0){double xx=1.0*(x[i]-x[i-1])*abs(k-y[i-1])/abs(y[i]-y[i-1]);xx+=x[i-1];e.push_back(xx);if(k<y[i-1])b+=dis(x[i-1],y[i-1],xx,k);else a+=dis(x[i-1],y[i-1],xx,k);if(k<y[i])b+=dis(x[i],y[i],xx,k);else a+=dis(x[i],y[i],xx,k);}else if(k==y[i-1]&&k==y[i]){e.push_back(x[i-1]);e.push_back(x[i]);}else if(k==y[i-1]){if(k<y[i])b+=dis(x[i],y[i],x[i-1],y[i-1]);else a+=dis(x[i],y[i],x[i-1],y[i-1]);e.push_back(x[i-1]);}else if(k==y[i]){if(k<y[i-1])b+=dis(x[i],y[i],x[i-1],y[i-1]);else a+=dis(x[i],y[i],x[i-1],y[i-1]);e.push_back(x[i]);}else if(k<y[i]&&k<y[i-1])b+=dis(x[i],y[i],x[i-1],y[i-1]);else a+=dis(x[i],y[i],x[i-1],y[i-1]);}if(e.size()>0){sort(e.begin(),e.end());for(int i=1;i<e.size();i+=2){a+=abs(e[i]-e[i-1]);b+=abs(e[i]-e[i-1]);}}if(a>b)swap(a,b);printf("Case #%d: %.3f %.3f\n\n",cas,a,b);}return 0;
}
F Camp Out
题意

多组样例,n个人要管理帐篷一周即168小时,现在把每天分成 6个时间段(12am-4am, 4am-8am, 8am-12pm, 12pm-4pm, 4pm-8pm, and 8pm-12am),每个时间段都要有三个人管理帐篷,且每个人管理帐篷的时间不超过80小时。问是否存在一个管理方案满足要求。

输入

2
7 1 0 24 2 0 24 3 0 24 4 0 24 5 0 24 6 0 24 7 0 24
6 1 0 24 2 0 24 3 0 24 4 0 24 5 0 24 6 0 24
5 1 0 24 2 0 24 3 0 24 4 0 24 5 0 24
4 1 0 24 2 0 24 3 0 24 4 0 24
4 1 0 24 2 0 24 3 0 24 4 0 23
1 1 0 24
2 1 10 12 2 3 7
7 1 0 24 2 0 24 3 0 24 4 0 24 5 0 24 6 0 24 7 0 24
7 1 0 24 2 0 24 3 0 24 4 0 24 5 0 24 6 0 24 7 0 24
7 1 0 24 2 0 24 3 0 24 4 0 24 5 0 24 6 0 24 7 0 24
7 1 0 1 2 0 1 3 0 1 4 0 1 5 0 1 6 0 1 7 0 1
7 1 1 2 2 1 2 3 1 2 4 1 2 5 1 2 6 1 2 7 1 2
1 2 1 2
1 3 1 2
1 4 1 2
1 5 1 2
1 6 1 2
1 7 1 2
1 2 2 3
1 2 3 4

输出

Case #1: NOCase #2: YES 
Solution

网络流建图。
判断最大流是否满足 3 × 168 3 \times 168 3×168
在这里插入图片描述

代码
#include<bits/stdc++.h>
#define ls i<<1
#define rs i<<1|1
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
#define INF 0x3f3f3f3f
int head[1005];
int cur[1005];
int deep[1005];
int cnt;
int n;
int S,T;
int vis[10][30];
struct Edge
{int to,w,next;
}edge[1005];
void init()
{memset(head,-1,sizeof head);cnt=0;
}
void add_edge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;
}
int dfs(int u,int flow)
{if(u==T)return flow;for(int &i=cur[u];i!=-1;i=edge[i].next){if(deep[edge[i].to]==deep[u]+1&&edge[i].w!=0){int d=dfs(edge[i].to,min(flow,edge[i].w));if(d>0){edge[i].w-=d;edge[i^1].w+=d;return d;}}}return 0;
}
int bfs()
{queue<int>q;while(!q.empty())q.pop();memset(deep,0,sizeof deep);deep[S]=1;q.push(S);do{int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){if(deep[edge[i].to]==0&&edge[i].w>0){deep[edge[i].to]=deep[u]+1;q.push(edge[i].to);if(edge[i].to==T)return 1;}}}while(!q.empty());if(deep[T]>0)return 1;return 0;
}
int Dinic()
{int ans=0;while(bfs()){for(int i=0;i<=T;i++)cur[i]=head[i];while(int d=dfs(S,INF)){ans+=d;}}return ans;
}
int main()
{int t;scanf("%d",&t);for(int cas=1;cas<=t;cas++){init();S=1,T=54;for(int i=1;i<=10;i++){add_edge(S,i+1,80);add_edge(i+1,S,0);int n;scanf("%d",&n);memset(vis,0,sizeof vis);for(int j=0;j<n;j++){int d,s,e;scanf("%d%d%d",&d,&s,&e);for(int k=s+1;k<=e;k++)vis[d][k]=1;}for(int j=1;j<=7;j++){for(int k=0;k<6;k++){if(vis[j][k*4+1]+vis[j][k*4+2]+vis[j][k*4+3]+vis[j][k*4+4]>0)continue;add_edge(i+1,12+6*(j-1)+k,4);add_edge(12+6*(j-1)+k,i+1,4);}}}for(int i=12;i<=53;i++)add_edge(i,T,12),add_edge(T,i,0);int ans=Dinic();//cout<<ans<<endl;if(ans==3*168)printf("Case #%d: YES\n\n",cas);else printf("Case #%d: NO\n\n",cas);}return 0;
}
G Sorry About That, Chief!
题意

多组样例,给定一个数 n,判断 n是否是素数,或者其离最近的素数的距离是多少。

输入

4
23
25
22
10000 

输出

Input value: 23
Would you believe it; it is a prime!Input value: 25
Missed it by that much (2)!Input value: 22
Missed it by that much (1)!Input value: 10000
Missed it by that much (7)! 
Solution

素数筛一下(裸题)。

代码
#include<bits/stdc++.h>
#define ls i<<1
#define rs i<<1|1
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int t,n;
const int N=1e4+10;
int prime[10015];
int vis[10015];
int cnt=0;
int main()
{vis[1]=1;for(int i=2;i<=N;i++){if(!vis[i])prime[cnt++]=i;for(int j=0;j<cnt&&1ll*i*prime[j]<=N;j++){vis[i*prime[j]]=1;if(i%prime[j]==0)break;}}scanf("%d",&t);while(t--){scanf("%d",&n);printf("Input value: %d\n",n);if(!vis[n])printf("Would you believe it; it is a prime!\n");else{int pos=lower_bound(prime,prime+cnt,n)-prime;int d=INF;if(pos<cnt)d=prime[pos]-n;if(pos>0)d=min(d,n-prime[pos-1]);printf("Missed it by that much (%d)!\n",d);}printf("\n");}return 0;
}
H Knight Moves – Gold Edition
题意

多组样例,问在一个 N × N N \times N N×N的棋盘中,能否从(R1,C1)走到(R2,C2),并且只能以下方式走,比如从(A,B)能走到,(A-2,B -1), (A-2, B+1), (A+2,
B-1), (A+2, B+1), (A-1, B-2), (A+1,B-2), (A-1, B+2) or (A+1, B+2)这几个点。题目保证一定能走到,问最少走几步。

输入

2
5 1 1 2 3
5 1 1 2 2 

输出

Case #1: 1Case #2: 4 
Solution

搜索裸题。

代码
#include<bits/stdc++.h>
#define ls i<<1
#define rs i<<1|1
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
#define INF 0x3f3f3f3f
int dx[]={-2,-2,2,2,-1,-1,1,1},dy[]={1,-1,1,-1,2,-2,2,-2};
int d[50][50];
int n,sx,sy,tx,ty;
void bfs()
{memset(d,INF,sizeof(d));d[sx][sy]=0;queue<P>q;q.push(P(sx,sy));while(!q.empty()){P p=q.front();q.pop();if(d[tx][ty]!=INF)return;for(int i=0;i<8;i++){int x=p.first+dx[i];int y=p.second+dy[i];if(x<1||x>n||y<1||y>n)continue;if(d[x][y]<d[p.first][p.second]+1)continue;d[x][y]=d[p.first][p.second]+1;q.push(P(x,y));}}
}
int main()
{int t;scanf("%d",&t);for(int cas=1;cas<=t;cas++){scanf("%d%d%d%d%d",&n,&sx,&sy,&tx,&ty);bfs();printf("Case #%d: %d\n\n",cas,d[tx][ty]);}return 0;
}
I Knight Moves – Black Edition

不会

J A Prickly Problem – Gold Edition
题意

K题数据简单版。

K A Prickly Problem – Black Edition
题意

给定一颗仙人掌,里面只有简单环,问能形成多少棵生成树。

输入

3
3 3
1 2
2 3
1 3
5 6
1 2
2 3
1 3
1 4
4 5
1 5
4 3
1 2
1 3
1 4

输出

Case #1: 3Case #2: 9Case #3: 1 
Solution

套生成树板子即可。

但是我用了另一种方法。
答案其实就是将所有简单环的边数相乘。
如何计算每个环的边数,使用LCA的性质,边数就是depth[x]+depth[y]-2*depth[lca]+1

代码
#include<bits/stdc++.h>
#define ls i<<1
#define rs i<<1|1
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
#define INF 0x3f3f3f3f
const int N=5e4+5;
const int mod=1007;
int n,m;
int f[N];
int Find(int x){return f[x]==x?x:f[x]=Find(f[x]);}
vector<int>e[N];
vector<P>g;
int u,v;
int res;
int depth[N];
int fa[N][20];
void bfs()
{for(int i=0;i<=n;i++)depth[i]=INF;queue<int>q;q.push(1);depth[1]=1;depth[0]=0;while(!q.empty()){int t=q.front();q.pop();for(auto to:e[t]){if(depth[to]>depth[t]+1){depth[to]=depth[t]+1;q.push(to);fa[to][0]=t;for(int j=1;j<=19;j++){fa[to][j]=fa[fa[to][j-1]][j-1];}}}}
}
int lca(int x,int y)
{if(depth[x]<depth[y])swap(x,y);for(int i=19;i>=0;i--){if(depth[fa[x][i]]>=depth[y])x=fa[x][i];}if(x==y)return x;for(int i=19;i>=0;i--){if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}}return fa[x][0];
}
int main()
{int t;scanf("%d",&t);for(int cas=1;cas<=t;cas++){scanf("%d%d",&n,&m);res=1;g.clear();for(int i=1;i<=n;i++){f[i]=i;e[i].clear();}for(int i=0;i<m;i++){scanf("%d%d",&u,&v);int x=Find(u),y=Find(v);if(x==y){g.push_back(P(u,v));}else{f[x]=y;e[u].push_back(v);e[v].push_back(u);}}bfs();for(auto p:g){u=p.first;v=p.second;int Lca=lca(u,v);//cout<<u<<' '<<v<<' '<<Lca<<endl;//cout<<depth[u]<<' '<<depth[v]<<' '<<depth[Lca]<<endl;res=res*(depth[u]+depth[v]-2*depth[Lca]+1)%mod;}printf("Case #%d: %d\n\n",cas,res);}return 0;
}

这篇关于2022-2-26 个人排位赛1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248764

相关文章

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

2025届计算机毕业设计:如何构建Java SpringBoot+Vue个人健康档案管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

【动手学深度学习】04 数据操作 + 数据预处理(个人向笔记)

数据操作 N维数组是机器学习和神经网络的主要数据结构其中 2-d 矩阵中每一行表示每一行表示一个样本 当维度来到三维的时候则可以表示成一张图片,再加一维就可以变成多张图片,再加一维则可以变成一个视频 访问元素 冒号表示从冒号左边的元素到冒号右边的前一个元素(开区间),其中如果左边为空,那么表示从第一个开始,如果右边为空,那么表示访问到最后一个,如果两边都为空,则表示全部访问其中一行中我们指

Thinkphp6.0+vue个人虚拟物品网站源码

Thinkphp6.0+vue个人虚拟物品网站源码 支持码支付对接 扫码自动发货 源码一共包含两个部分thinkphp6.0后端文件,以及vue前端文件。 服务器环境 php7以上,mysql5.6以上; 内附安装说明 代码免费下载

上海大学《2022年836+915自动控制原理真题及答案》 (完整版)

Part1:2022年上海大学真题题目 学硕836 专硕915 Part2:2022年上海大学真题答案 学硕836 专硕915

Windows目录及程序安装路径个人习惯

目录 一、系统盘IntelProgram FilesProgram Files (x86)ProgramDataWindowsUsers 二、软件盘360AdobeGameSoftMyIDESQLTencentWorkSoftXunLei 三、文件盘ApacheTencentDataMediaGameDataMyProject其他文件最终下载 视情况、或文中错误,而不定期更

分享个人学习和解决问题的的方法

1.自己去分析问题,去看源码 2.去百度搜索 3.去问同学同事朋友 4.去QQ群里问 除了自己解决,我最支持的是去QQ群里问, QQ群里有全国各地的程序员,有各种水平的程序员, 这样一个问题,会有各种各样的答案,学到更多的知识。 同时,我也建议大家去有空了去群里回答问题, 帮助别人的同时也可以自己学到知识,何乐而不为?