1 条题解
-
1
F1
用数组暴力的方法想必大家应该都会做,只需要在该转弯的地方右转就可以了。但是请看这个数据范围:
那如果我们直接开数组的话,想要拿到满分,那我就想问问你,数组能开这么大吗?啊?(
a[30005][30005]
)所以这个题用数组模拟的方法肯定是不行了,只能拿到50分。F2
有没有一种别的方法能让我们快速的知道题目给定的位置对应的数是多少呢?当然有一种方法。那就是我们首先快速的把上下左右4条外围的边走完。然后再一步一步的推算里面题目给定的坐标位置所对应的数对应的这条边,那么外围的圈数是多少呢?是
min({i-1,j-1,n-i,n-j})
接下来我们只需要分情况讨论,坐标所对应的这一圈到底是在上下左右哪条边上。然后根据我们的累加情况处理之后的结果输出出来。这道题就结束了。上AC代码!
#include<bits/stdc++.h> using namespace std; int n,i,j,k; int main(){ cin>>n>>i>>j; k=min({i-1,j-1,n-i,n-j}); int ans=4*k*(n-k); int d=n-2*k; if(i==k+1){ cout<<ans+0*d+j-k<<endl; }else if(j==n-k){ cout<<ans+1*d+i-k-1<<endl; }else if(i==n-k){ cout<<ans+2*d-1+n-k-j<<endl; }else{ cout<<ans+3*d-2+n-k-i<<endl; } return 0; }
信息
- ID
- 940
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 66
- 已通过
- 19
- 上传者