NC248511. 翼伯父作威
描述
输入描述
输入第一行是一个整数,表示样例组数。
每组样例输入两个正整数,表示初始棋子的坐标。
输出描述
对每组用例,输出一个整数,表示游戏结束时手中钱数更多的人有多少钱。
示例1
输入:
3 2 2 1 2 8 5
输出:
1999999999 1999999998 1999999995
C++(g++ 7.5.0) 解法, 执行用时: 326ms, 内存消耗: 7804K, 提交时间: 2023-02-25 11:45:04
#include<bits/stdc++.h> using namespace std; int ax[2000005]; void ini() { int cnt=1; for(int i=1;i<=1000000;i++) if(ax[i]==0) { ax[i]=cnt*2; ax[i+cnt]=cnt*2; cnt++; } } int main() { int t; cin>>t; ini(); while(t--) { int x,y; cin>>x>>y; int ans=2e9; if(x==y) cout<<ans-1<<endl; else if(ax[x]==ax[y]) cout<<ans-ax[x]<<endl; else cout<<ans-min(min(ax[x],ax[y])+1,abs(x-y)*2+1)<<endl; } return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 325ms, 内存消耗: 9148K, 提交时间: 2023-02-25 19:53:59
#include<iostream> using namespace std; const int N=1e6+10; int vis[2*N]; const int INF=2e9; int main() { int p=0,cnt=1; vis[0]=0; for(int i=1;i<=1e6;i++) { if(!vis[i]) { vis[i]=i+cnt; vis[i+cnt]=i; cnt++; } } int t; cin>>t; while(t--) { int x,y; cin>>x>>y; int c=abs(y-x)*2+1; if(x==vis[y]||y==vis[x]) cout<<INF-2*abs(y-x)<<endl; else { if(x>vis[y]) c=min(c,1+2*abs(y-vis[y])); if(y>vis[x]) c=min(c,1+2*abs(x-vis[x])); cout<<(INF-c)<<endl; } } return 0; }