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;
}

京公网安备 11010502036488号