拼多多笔试题解
第一题:直接开个cnt数组记录每个点的覆盖次数即可
#include<bits/stdc++.h>
using namespace std;
const int maxn=2018;
int cnt[110];
int main()
{
int n,k,a,b;
while(cin>>n>>k)
{
for(int i=0;i<n;i++)
{
cin>>a>>b;
for(int j=a+50;j<=b+50;j++) cnt[j]++;
}
int pos1=-1,pos2=-1;
for(int i=0;i<=100;i++)
{
if(cnt[i]>=k)
{
pos1=i-50;
break;
}
}
for(int i=100;i>=0;i--)
{
if(cnt[i]>=k)
{
pos2=i-50;
break;
}
}
if(pos1==-1||pos2==-1) cout<<"error"<<endl;
else cout<<pos1<<" "<<pos2<<endl;
}
return 0;
}
第二题:没啥好说的
#include<bits/stdc++.h>
using namespace std;
#define eps 1e-8
int main()
{
double h,m;
while(~scanf("%lf:%lf",&h,&m))
{
double ans=30*h-5.5*m;
if(ans<eps) ans=-ans;
int t=(int)ans;
double t1=(double)t;
if(ans==t1)
{
int tmp=t%360;
if(tmp>180) tmp=360-tmp;
printf("%d\n",abs(tmp));
}
else
{
double tmp=ans-(t/360)*360.0;
if(tmp>180.0) tmp=360.0-tmp;
printf("%.1f\n",abs(tmp));
}
}
return 0;
}
第三题:直接暴力,枚举三点,判断是否三点共线
#include<bits/stdc++.h>
using namespace std;
#define eps 1e-8
#define zero(x)(((x)>0?(x):-(x))<eps)
const int maxn=110;
struct point
{
double x,y;
}p[maxn];
double xmult(point p1,point p2,point p0)
{
return(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int dots_inline(point p1,point p2,point p3)
{
return zero(xmult(p1,p2,p3));
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
int cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
if(i!=j&&i!=k&&k!=j&&!dots_inline(p[i],p[j],p[k]))
{
cnt++;
}
}
}
}
printf("%d\n",cnt/6);
}
return 0;
} 第四题:单调队列求滑动窗口最大值,最小值
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,k,a[maxn];
int MIN[maxn],MAX[maxn],q[maxn];
void solve1()
{
memset(q,0,sizeof(q));
int head=1,tail=1;
q[tail]=1;MIN[1]=a[1];
for(int i=2;i<=n;i++)
{
while((head<=tail)&&(a[i]<a[q[tail]]))tail--;
q[++tail]=i;
while((head<=tail)&&(q[head]<i-k+1)) head++;
MIN[i]=a[q[head]];
}
}
void solve2()
{
memset(q,0,sizeof(q));
int head=1,tail=1;
q[tail]=1;MAX[1]=a[1];
for(int i=2;i<=n;i++)
{
while((head<=tail)&&(a[i]>a[q[tail]])) tail--;
q[++tail]=i;
while((head<=tail)&&(q[head]<i-k+1)) head++;
MAX[i]=a[q[head]];
}
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
solve1();solve2();
for(int i=k;i<n;i++) printf("%d ",MAX[i]-MIN[i]);
printf("%d\n",MAX[n]-MIN[n]);
}
return 0;
} #笔试题目#
莉莉丝游戏公司福利 699人发布