CF424D Biathlon Track 题解
题意
分析
真·暴力踩标算
记录从上至下、从下至上、从左至右、从右至左花费时间的前缀和,暴力枚举每一个左上角的点和右下角的点的坐标,计算出此时的总时间和 \(t\) 的差,如果比目前的最小值小就更新答案。时间复杂度大概为 \(O(\frac{n^2m^2}{4})\) ,显然会 TLE ,但是时限 4.5s ,随便卡卡就过了。
代码
#include
#define int long long
using namespace std;
const int MAXN=307;
inline void qread(){}template
inline void qread(T1 &a,T2&... b)
{
register T1 x=0;register bool f=false;char ch=getchar();
while(ch<'0') f|=(ch=='-'),ch=getchar();
while(ch>='0') x=(x*10)+(ch^48),ch=getchar();
x=(f?-x:x);a=x;qread(b...);
}
templateinline T qmax(const T &a,const T &b){return a>b?a:b;}
templateinline T qmin(const T &a,const T &b){return a=1;j--) pre[1][i][j]=pre[1][i][j+1]+f(i,j,i,j+1); // 从右往左
for(j=1;j<=m;j++) for(i=1;i<=n;i++) pre[2][i][j]=pre[2][i-1][j]+f(i,j,i-1,j); // 从上往下
for(j=1;j<=m;j++) for(i=n;i>=1;i--) pre[3][i][j]=pre[3][i+1][j]+f(i,j,i+1,j); // 从下往上
}
int mn=1e9+7,a1,b1,a2,b2;
signed main()
{
qread(n,m,t,tp,tu,td);int i,j,k,l;
for(i=1;i<=n;i++) for(j=1;j<=m;j++) qread(a[i][j]);init();
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
for(k=i+2;k<=n;k++)
{
for(l=j+2;l<=m;l++)
{
int tmp=pre[0][i][l]-pre[0][i][j]+ // 上面的一行
pre[1][k][j]-pre[1][k][l]+ // 下面的一行
pre[2][k][l]-pre[2][i][l]+ // 右面的一列
pre[3][i][j]-pre[3][k][j]; // 左面的一列
tmp=abs(t-tmp);
if(mn>=tmp)
{
mn=tmp;
a1=i,b1=j,a2=k,b2=l;
}
}
}
}
}
printf("%lld %lld %lld %lld\n",a1,b1,a2,b2);
return 0;
}