codeforces 8c Looking for Order
https://vjudge.net/problem/CodeForces-8C
题意:
一个平面上放着许多东西,每个东西都有一个坐标,最开始一个人在一个起始坐标,她出发去拿东西,一次要么拿一件东西,要么拿两件东西,拿了之后必须返回起始坐标。
每次花费的时间是两个坐标距离的平方,问拿完所有的东西需要的最少的时间。
思路:
由于数据范围比较小,所以可以考虑用状压dp来写。由于每次拿东西之后都要返回起点,那么其实拿东西的顺序是没有影响的,所以利用题目给定的顺序进行剪枝,即每次进行扩展的时候都考虑在前面的点已经取完了。
然后每次记录的时候,非常巧妙的方法,如果一个点的话,直接记录这个点,如果有两个点的话,那么就用(i+1)*100 + (j+1)来记录,因为点数最多时只有24,输出的时候递归输出就行了,递归输出这里还是比较巧妙的。
代码:(有详细的注释)
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std; struct node
{
int x,y;
} a[]; int mp[][];
vector<int> ans; int cal(int i,int j)
{
return (a[i].x - a[j].x) * (a[i].x - a[j].x) + (a[i].y - a[j].y) * (a[i].y - a[j].y);
} const int maxn = ( << )+;
const int gg = 0x3f3f3f3f; int dp[maxn],last[maxn],rec[maxn]; void output(int s)
{
if (~last[s])
output(last[s]);//递归输出 if (rec[s])
{
if (rec[s] > ) ans.push_back(rec[s] / );//第一个扩展的点 ans.push_back(rec[s] % );
ans.push_back();//每次都要返回起点
}
} int main()
{
int n; node tmp; scanf("%d%d",&tmp.x,&tmp.y); scanf("%d",&n); for (int i = ;i < n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
} a[n] = tmp; for (int i = ;i <= n;i++)
for (int j = i + ;j <= n;j++)
mp[i][j] = mp[j][i] = cal(i,j); memset(dp,gg,sizeof(dp));
memset(last,-,sizeof(last)); dp[] = ; for (int s = ;s < (<<n);s++)
{
if (dp[s] >= gg) continue; for (int i = ;i < n;i++)
{
if ((( << i) & s) == )//这个点没有被走过
{
int val = dp[s] + mp[n][i] * ; if (dp[s|( << i)] > val)
{
dp[s|( << i)] = val;
last[s|( << i)] = s;//记录前驱,下同
rec[s|( << i)] = i+;
} for (int j = i + ;j < n;j++)//从i+1开始枚举保证了不会有重复情况
{
if (((<<j)&s) == )
{
int tmp = dp[s] + mp[n][i] + mp[i][j] + mp[j][n]; if (dp[s|(<<i)|(<<j)] > tmp)
{
dp[s|(<<i)|(<<j)] = tmp;
last[s|(<<i)|(<<j)] = s;
rec[s|(<<i)|(<<j)] = (i+) * + (j+);//巧妙的记录
}
}
} break;//强行顺序剪枝
}
} //printf("%d\n",dp[s]);
} ans.clear(); output((<<n)-); printf("%d\n",dp[(<<n)-]); printf("0 "); for (int i = ;i < ans.size();i++)
printf("%d%s",ans[i],i == ans.size() - ? "\n" :" "); return ;
}
codeforces 8c Looking for Order的更多相关文章
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- 【题解】codeforces 8c Looking for Order 状压dp
题目描述 Lena喜欢秩序井然的生活.一天,她要去上大学了.突然,她发现整个房间乱糟糟的--她的手提包里的物品都散落在了地上.她想把所有的物品都放回她的手提包.但是,这里有一点问题:她一次最多只能拿两 ...
- Codeforces 993E Nikita and Order Statistics [FFT]
洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...
- codeforces 637B B. Chat Order(map,水题)
题目链接: B. Chat Order time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- codeforces 8C(非原创)
C. Looking for Order time limit per test 4 seconds memory limit per test 512 megabytes input standar ...
- [Codeforces 993E]Nikita and Order Statistics
Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,和一个数 \(x\) ,对于每个 \(i= 0\sim n\) ,求有多少个非空子区间满足恰好有 \(i\) 个数 ...
- Codeforces 8C 状压DP
题意:有个人想收拾行李,而n个物品散落在房间的各个角落里(n < 24).现在给你旅行箱的坐标(人初始在旅行箱处),以及n个物品的坐标,你一次只能拿最多两个物品,并且拿了物品就必须放回旅行箱,不 ...
- [CF] 8C Looking for Order
状压模板题 CF难度2000? 我得好好了解一下CF的难度机制了 反正CF的难度比洛谷真实就好了 Code #include<algorithm> #include<iostream ...
- CF dp 题(1500-2000难度)
前言 从后往前刷 update 新增 \(\text{\color{red}{Mark}}\) 标记功能,有一定难度的题标记为 \(\text{\color{red}{红}}\) 色. 题单 (刷过的 ...
随机推荐
- vue中引入swiper(vue中的滑块组件vue-awesome-swiper)
第一步安装 npm install vue-awesome-swiper --save 第二部在main.js中引入 import VueAwesomeSwiper from 'vue-awesome ...
- Java中的异常和处理详解
简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?. ...
- 第二次项目冲刺(Beta阶段)5.23
1.提供当天站立式会议照片一张 会议内容: ①检查前一天的任务情况,将遇到的瓶颈反馈,看看团队成员是否有好的建议. ②制定新一轮的任务计划. 2.每个人的工作 (1)工作安排 队员 今日进展 明日安排 ...
- 201521123060 《Java程序设计》第5周学习总结
1.本周学习总结 2.书面作业 Q1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 答:不能 ...
- 201521123037 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...
- java第十二次作业
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 201521123078 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 1.互斥访问与同步访问 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么 ...
- 201521123092《java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 201521123015 《Java程序设计》第13周学习总结
1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? IP地址不同 ...
- 从java的开始,java概述,java配置环境变量
一.java开发入门 java 概述 Java划分为三个技术平台:JavaSE(标准版,含Java基础类库),JavaEE(企业版,技术平台),JavaME(小型版,小型产品.嵌入式设备) Jav ...