[JZOJ4622] 亚瑟王之宫
2016-07-13 15:27
141 查看
Description
Solution
一开始看这题感觉骑士跳的最短路径很难处理,后来发现其实直接跑Floyd就可以了。然后我们暴力枚举选哪两个点,假设所有的骑士都往第一个点走。
然后我们现在要选一些点移到第二个点去。
那我们显然选 到第二个点的距离−到第一个点的距离最小的N2个移过去就好。
证明显然
Code
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> #define fo(i,a,b) for(i=a;i<=b;i++) #define fod(i,a,b) for(i=a;i>=b;i--) using namespace std; int f[405][405],n,m,num,al,fx[8][2]={{1,2},{-1,2},{1,-2},{-1,-2},{2,1},{-2,1},{2,-1},{-2,-1}}; int a[205][2],b[205]; int wz(int x,int y) { return ((x-1)*m)+y; } int main() { cin>>num>>m>>n; int i,j,k,l,p; fo(i,1,num) scanf("%d%d",&a[i][0],&a[i][1]); fo(i,1,n*m) { fo(j,1,n*m) { f[i][j]=1000000000; } } fo(i,1,n) { fo(j,1,m) { fo(k,0,7) { int x1=i+fx[k][0],y1=j+fx[k][1]; if (x1>0&&y1>0&&x1<=n&&y1<=m) f[wz(i,j)][wz(x1,y1)]=1; } } } al=n*m; fo(k,1,al) { fo(i,1,al) { f[i][i]=0; fo(j,1,al) { f[i][j]=min(f[i][j],f[i][k]+f[k][j]); } } } int ans=1000000000; fo(i,1,n) { fo(j,1,m) { fo(k,1,n) { fo(l,1,m) { int s=0; if (i!=k||j!=l) { fo(p,1,num) { s+=f[wz(i,j)][wz(a[p][0],a[p][1])]; b[p]=-f[wz(i,j)][wz(a[p][0],a[p][1])]+f[wz(k,l)][wz(a[p][0],a[p][1])]; } sort(b+1,b+num+1); fo(p,1,num/2) s+=b[p]; ans=min(ans,s); } } } } } cout<<ans; }
相关文章推荐
- 好的句子
- LeetCode 14. Longest Common Prefix最长公共前缀
- [Android]异步任务AsyncTask使用解析
- 无线路由器WiFi密码破解
- 数据分析系统Hive
- Caused by: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.
- 一行代码解决Android M新的运行时权限问题
- hdu3087 LCA + 暴力
- github clone速度慢的解决方案
- 读书笔记-现代操作系统-6死锁-6.5死锁避免
- HDU3613 Best Reward - exkmp/Manacher
- 使用ApplicationContext启动standard模式的Activity报错原因解析
- [置顶] 资深首席架构师眼中的架构应该是怎样的?
- 关于angularjs中$http POST请求参数的问题
- [LeetCode 16] 3Sum Closest
- map hash_map unordered_map 性能比较
- CentOS 建立本地yum源服务器
- C#:复杂条件判断类型(练习)
- .NET NPOI导出Excel详解
- 会做饭,擅长烹饪,会给你的工作生活带来怎样的不同?