NC222519. Honeycomb
描述
输入描述
第一行,一个整数 ,表示有T组询问。
对于每组询问,输入一行。每行两个正整数 ,表示两个格子的编号。
输出描述
对于每组询问,输出一行。每行一个整数,表示两个格子之间的格子数量。
示例1
输入:
6 3 6 1 12 12 18 12 23 48 60 42 54
输出:
3 3 5 4 9 9
C++(g++ 7.5.0) 解法, 执行用时: 392ms, 内存消耗: 1192K, 提交时间: 2023-07-29 21:23:16
#include<bits/stdc++.h> using namespace std; using i64=long long; const int dx[] = {1, 0, -1, -1, 0, 1}; const int dy[] = {0, 1, 1, 0, -1, -1}; int T, num, x[2], y[2], ans; vector<int> z; int main() { for (int i = 0; i * (i - 1) * 3 + 1 <= 1000000000; i++) z.push_back(i * (i + 1) * 3 + 1); cin>>T; while (T--) { memset(x, 0, sizeof(x)); for (int i = 0; i < 2; i++) { cin>>num; int p = lower_bound(z.begin(), z.end(), num) - z.begin(); y[i] = -p, num = z[p] - num; for (int j = 0, l; j < 6 && num; j++) { l = min(num, p), num -= l; x[i] += dx[j] * l; y[i] += dy[j] * l; } } x[0] -= x[1], y[0] -= y[1]; if (x[0] * y[0] > 0) ans = abs(x[0]) + abs(y[0]) + 1; else ans = max(abs(x[0]), abs(y[0])) + 1; cout<<ans<<"\n"; } return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 288ms, 内存消耗: 3008K, 提交时间: 2023-05-18 18:18:11
#include<bits/stdc++.h> using namespace std; int t; int dx[6]={1,0,-1,-1,0,1},dy[6]={0,1,1,0,-1,-1},x[2],y[2]; vector<int>seq; int main() { for(int i=0;3*i*(i-1)+1<1e9;i++)seq.push_back(i*3*(i+1)+1); scanf("%d",&t); while(t--) { for(int i=0;i<2;i++) { int q; scanf("%d",&q); int idx=lower_bound(seq.begin(),seq.end(),q)-seq.begin(); int dif=seq[idx]-q; y[i]=-idx; x[i]=0; for(int j=0;j<6&&dif;j++) { int tmp=min(dif,idx); dif=dif-tmp; x[i]+=dx[j]*tmp; y[i]+=dy[j]*tmp; } } int x0=x[0]-x[1],y0=y[0]-y[1]; if(x0*y0<0)cout<<max(abs(x0),abs(y0))+1<<endl; else cout<<abs(x0)+abs(y0)+1<<endl; } return 0; }