D-Duration


题意
签到题,两个时刻求秒数差
思路
直接计算两个时刻所代表的秒数,求差
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+2;
ll gcd(ll a,ll b){return b?(b,a%b):a;}
ll qmi(int a,int b,int p){ll res=1;while(b){if(b&1)res=res*a%p;a=a*(ll)a%p;b>>=1;}return res;}
int main(){
char a[8],b[8];
cin>>a>>b;
int sum1=((a[0]-'0')*10+a[1]-'0')*3600+60*((a[3]-'0')*10+a[4]-'0')+10*(a[6]-'0')+a[7]-'0';
int sum2=((b[0]-'0')*10+b[1]-'0')*3600+60*((b[3]-'0')*10+b[4]-'0')+10*(b[6]-'0')+b[7]-'0';
cout<<abs(sum1-sum2);
return 0;
}
B-Boundary


题意
平面内给定n个点,求一个包括原点的圆,使其在上边的点最多
思路
枚举每一个点,计算该点,其他点,原点这三个点形成的圆心,一边求一边维护最大值即可,最后一定要加上1,因为枚举点时,计算同圆心的点时,并没有将枚举点算在内。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
typedef pair<double,double>pdd;
LL gcd(int a,int b){return b?gcd(b,a%b):a;}
const int N = 5010;
vector<pdd> v;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
double x,y;
scanf("%lf%lf",&x,&y);
v.push_back({x,y});
}
int res = 0;
map<pdd,int> m;
for(int i=0;i<n;i++)
{
m.clear();
auto a = v[i];
for(int j = i+1;j<n;j++)
{
if(i==j)continue;
auto b = v[j];
if(a.x*b.y-b.x*a.y==0)continue ;
double x=( (a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*(a.y)-(a.x*a.x+a.y*a.y)*(a.y-b.y) ) / (2.0*(a.y)*(a.x-b.x)-2*(a.y-b.y)*(a.x));
double y=( (a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*(a.x)-(a.x*a.x+a.y*a.y)*(a.x-b.x) ) / (2.0*(a.y-b.y)*(a.x)-2*(a.y)*(a.x-b.x));
m[{x,y}]++;
res = max(res,m[{x,y}]);
}
}
cout<<res+1<<endl;
return 0;
}
F-Fake Maxpooling


题意
给你一个n×m的矩阵,ai,j的值为i和j的最小公倍数,给定一个k,求k×k子矩阵最大值的和
思路
暴力肯定是不行滴,单调队列横着跑一遍,竖着跑一遍。
代码
摸一份队友的码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
LL gcd(int a,int b){return b?gcd(b,a%b):a;}
const int N = 5010;
int n,m,k,a[N][N],b[N][N],c[N][N],q[N];
int hh=0,tt=-1;
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!b[i][j])
for(int k=1;i*k<=n&&j*k<=m;k++)
{
b[i*k][j*k] = k;
a[i*k][j*k] = i*j*k;
}
memset(b,0,sizeof b);
for(int i = 1;i<=n;i++)
{
hh = 0,tt = -1;
for(int j=1;j<=m;j++)
{
if(hh<=tt&&j-k+1>q[hh])
hh++;
while(hh<=tt&&a[i][j]>=a[i][q[tt]])
tt--;
q[++tt] = j;
b[i][j] = a[i][q[hh]];
}
}
long long res = 0;
for(int j = 1;j<=m;j++)
{
hh = 0,tt = -1;
for(int i=1;i<=n;i++)
{
if(hh<=tt&&i-k+1>q[hh])
hh++;
while(hh<=tt&&b[i][j]>=b[q[tt]][j])
tt--;
q[++tt] = i;
if(i>=k&&j>=k)
res+=b[q[hh]][j];
cout<<res<<endl;
return 0;
}
本文详细解析了牛客多校第二场的三道算法题目,涉及时间差计算、包含原点的最大圆问题以及矩阵最大子矩阵和的求解。通过题意阐述、解题思路及代码实现,帮助读者理解并掌握这些算法问题。

413

被折叠的 条评论
为什么被折叠?



