Boundary
链接:https://ac.nowcoder.com/acm/contest/5667/B
枚举点,然后再枚举另一点,通过圆心公式代出圆心坐标,然后求最多对于同一点A,有多少点B使得圆心同一点,答案+1即可
#include<bits/stdc++.h> using namespace std; const int MAXN=2005; int n,ans; double a[MAXN],b[MAXN],x,y; typedef pair<double,double> p; map<p,int> mx; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf",a+i,b+i); for(int i=1;i<=n;i++){ mx.clear(); for(int j=i+1;j<=n;j++) if(a[i]*b[j]!=a[j]*b[i]){ x=((b[j]-b[i])*b[i]*b[j]-a[i]*a[i]*b[j]+a[j]*a[j]*b[i])/(a[j]*b[i]-a[i]*b[j]); y=((a[j]-a[i])*a[i]*a[j]-b[i]*b[i]*a[j]+b[j]*b[j]*a[i])/(b[j]*a[i]-b[i]*a[j]); mx[p(x,y)]++; ans=max(mx[p(x,y)],ans); } } printf("%d\n",ans+1); return 0; }
Duration
链接:https://ac.nowcoder.com/acm/contest/5667/D
这题非常简单,只要把时间转换为以秒为单位即可
#include<iostream> using namespace std; int main(){ int a,b,c,d,e,f; scanf("%d:%d:%d\n%d:%d:%d",&a,&b,&c,&d,&e,&f); cout<<abs(a*3600+b*60+c-d*3600-e*60-f); return 0; }
Fake Maxpooling
链接:https://ac.nowcoder.com/acm/contest/5667/F
看了很多大佬的题解,这题的正解应该是单调队列,不过我暂时还没学到那一块,所以只好用DP来做这道题。通过打表可以发现,最大值一般出现在点的周围,故其递推关系容易得出,具体见代码。
#include<bits/stdc++.h> using namespace std; const int N=5e3+5; typedef long long ll; int dp[N][N]; int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } int main(){ int n,m,k; ll ans=0; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[i][j]=i*j/gcd(i,j); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(k!=1) dp[i][j]=max({dp[i][j],dp[i-1][j],dp[i][j-1]}); else dp[i][j]=dp[i][j]; if(i>=k&&j>=k) ans+=dp[i][j]; } printf("%lld",ans); return 0; }