当前位置: 代码迷 >> 综合 >> AtCoder Beginner Contest 112题解
  详细解决方案

AtCoder Beginner Contest 112题解

热度:57   发布时间:2023-11-21 07:01:04.0

AtCoder Beginner Contest 112

比赛链接

前言

这场ABC我用了一个小时AK (虽然我晚到了5分钟)(虽然这是我第一次AK)

所以我写下这篇博客作为纪念。

A.Programming Education

题外话

这个名字起得真好:编程教育。但其实是道水题。。。

题目大意

给定一个数NNN,若N=1N=1N=1则输出Hello World;若N=2N=2N=2则继续读入两个数A,BA,BA,B,并输出A+BA+BA+B的结果。

正解代码

不用说了,水题,直接粘代码。

#include<cstdio> #include<algorithm> using namespace std;int main() {
     #ifdef LOACLfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifint N;scanf("%d",&N);if(N==1) {
     puts("Hello World");} else {
     int a,b;scanf("%d %d",&a,&b);printf("%d\n",a+b);}return 0; } 

B.Time Limit Exceeded

题目大意

给定TTTNNN组有序点对(ci,ti)(c_i,t_i)(ci?,ti?),要求找到一个点对,使得它的t&lt;=Tt&lt;=Tt<=Tccc尽可能的小。

思路

emmm…没什么可讲的,按照题目意思暴力模拟就行了。。。

正解代码

#include<cstdio> #include<algorithm> using namespace std;int main() {
     #ifdef LOACLfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifint N,T;int ans=1e9;scanf("%d %d",&N,&T);for(int i=1;i<=N;i++) {
     int cos,t;scanf("%d %d",&cos,&t);if(t<=T)ans=min(ans,cos);}if(ans==1e9)puts("TLE");else printf("%d\n",ans);return 0; } 

C - Pyramid

题目大意

有一座金字塔,其中心为(Cx,Cy)(C_x,C_y)(Cx?,Cy?),高度为HHH,它周围的点(x,y)(x,y)(x,y)的高度为max?(0,H?∣Cx?x∣?∣Cy?y∣)\max(0,H-|C_x-x|-|C_y-y|)max(0,H?Cx??x?Cy??y)。现给定NNN个平面上的点(xi,yi)(x_i,y_i)(xi?,yi?)及它们的高度hih_ihi?,求这个金字塔的HHH

思路

由于题目给定0≤Cx,Cy,xi,yi≤1000\le C_x,C_y,x_i,y_i\le1000Cx?,Cy?,xi?,yi?100,所以直接暴力枚举(Cx,Cy)(C_x,C_y)(Cx?,Cy?),并与给定信息比对一下即可。

正解代码

#include<cstdio> #include<algorithm> using namespace std;typedef long long ll; const int Maxn=100;int N; int cx,cy; ll h; struct Node {
     int X,Y;ll H;bool operator < (const Node &rhs) const {
     return H>rhs.H;} }A[Maxn+5];inline ll abs(ll a) {
     if(a<0)return -a;return a; }int main() {
     #ifdef LOACLfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifscanf("%d",&N);for(int i=1;i<=N;i++)scanf("%d %d %lld",&A[i].X,&A[i].Y,&A[i].H);sort(A+1,A+N+1);for(cx=0;cx<=100;cx++) {
     bool flag=false;for(cy=0;cy<=100;cy++) {
     ll th=max(0LL,abs(A[1].X-cx)+abs(A[1].Y-cy)+A[1].H);if(th<1)break;for(int i=2;i<=N;i++)if(max(0LL,th-abs(A[i].X-cx)-abs(A[i].Y-cy))!=A[i].H) {
     th=-1;break;}if(th!=-1) {
     h=th;flag=true;break;}}if(flag)break;}printf("%d %d %lld",cx,cy,h);return 0; } 

D - Partition

题目大意

MMM拆成NNN个数,求这NNN个数的最大公因数最大的方案。

思路

我们设MMM拆分后的NNN个数中最大公约数为kkk,第iii个数除以kkk的商为kik_iki?,则不难得出以下关系式:M=kk1+kk2+?+kkNM=kk_1+kk_2+\cdots+kk_NM=kk1?+kk2?+?+kkN?

整理一下:M=k×∑i=1NkiM=k\times\sum_{i=1}^{N}{k_i}M=k×i=1N?ki?

则不难看出kkkMMM的因数。

所以我们只需枚举MMM的因数,再判断一下MMM除以该因数再除以NNN的结果是否大于0即可(因为不能够有0出现)。

正解代码

#include<cstdio> #include<cmath> #include<algorithm> using namespace std;int N,M;int main() {
     #ifdef LOACLfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifscanf("%d %d",&N,&M);if(N==1) {
     printf("%d\n",M);return 0;}int ans=1;for(int i=2;i*i<=M;i++)if(M%i==0) {
     int tmp=M/i;if(tmp/N>0)ans=max(ans,i);if(i/N>0)ans=max(ans,tmp);}printf("%d\n",ans);return 0; } 
  相关解决方案