NC53191. 硬币收藏
描述
输入描述
从标准输入中读取数据。
第一行一个整数N。
接下来2N行,第i行为两个整数和。
输出描述
输出数据到标准输出中。
输出一行一个整数,表示完成目标所需的最少操作次数。
示例1
输入:
3 0 0 0 4 4 0 2 1 2 5 -1 1
输出:
15
说明:
示例2
输入:
4 2 1 2 1 2 1 3 1 3 1 3 1 3 1 3 1
输出:
9
示例3
输入:
5 1000000000 1000000000 -1000000000 1000000000 -1000000000 -1000000000 1000000000 -1000000000 -1 -5 -2 2 2 8 4 7 -2 5 7 3
输出:
8000000029
C++14(g++5.4) 解法, 执行用时: 242ms, 内存消耗: 1748K, 提交时间: 2020-05-13 17:54:21
#include <bits/stdc++.h> using namespace std; int b[1000005][3],n; long long ans=0; int main(){ cin>>n; for(int x,y,i=1;i<=2*n;i++){ cin>>x>>y; if(x<1){ ans+=1-x; x=1; } if(x>n){ ans+=x-n; x=n; } if(y<1){ ans+=1-y; y=1; } if(y>2){ ans+=y-2; y=2; } b[x][y]++; } for(int i=1,x=0,y=0;i<=n;i++){ x+=b[i][1]-1; y+=b[i][2]-1; while(x<0&&y>0){ x++; y--; ans++; } while(x>0&&y<0){ x--; y++; ans++; } if(i<n) ans+=abs(x)+abs(y); } cout<<ans; }
C++11(clang++ 3.9) 解法, 执行用时: 101ms, 内存消耗: 5228K, 提交时间: 2020-04-15 21:07:30
#include<bits/stdc++.h> #define ll long long using namespace std; ll n,i,x,y,ans,a[500010][2]; int main(){ scanf("%lld",&n); for(i=1;i<=n*2;i++){ scanf("%lld%lld",&x,&y); if(x<1)ans+=1-x,x=1; if(y<1)ans+=1-y,y=1; if(x>n)ans+=x-n,x=n; if(y>2)ans+=y-2,y=2; a[x][y]++; } x=y=0; for(i=1;i<=n;i++){ x+=a[i][1]-1;y+=a[i][2]-1; while(x<0&&y>0)x++,y--,ans++; while(x>0&&y<0)x--,y++,ans++; ans+=abs(x)+abs(y); } printf("%lld",ans); }