拼多多笔试题解
第一题:直接开个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; }
#笔试题目#