codeforces 8c Looking for Order

时间:2022-09-09 11:29:25

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的更多相关文章

  1. codeforces 8C&period; Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include &lt ...

  2. 【题解】codeforces 8c Looking for Order 状压dp

    题目描述 Lena喜欢秩序井然的生活.一天,她要去上大学了.突然,她发现整个房间乱糟糟的--她的手提包里的物品都散落在了地上.她想把所有的物品都放回她的手提包.但是,这里有一点问题:她一次最多只能拿两 ...

  3. Codeforces 993E Nikita and Order Statistics &lbrack;FFT&rsqb;

    洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...

  4. codeforces 637B B&period; Chat Order&lpar;map&comma;水题&rpar;

    题目链接: B. Chat Order time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  5. codeforces 8C(非原创)

    C. Looking for Order time limit per test 4 seconds memory limit per test 512 megabytes input standar ...

  6. &lbrack;Codeforces 993E&rsqb;Nikita and Order Statistics

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,和一个数 \(x\) ,对于每个 \(i= 0\sim n\) ,求有多少个非空子区间满足恰好有 \(i\) 个数 ...

  7. Codeforces 8C 状压DP

    题意:有个人想收拾行李,而n个物品散落在房间的各个角落里(n < 24).现在给你旅行箱的坐标(人初始在旅行箱处),以及n个物品的坐标,你一次只能拿最多两个物品,并且拿了物品就必须放回旅行箱,不 ...

  8. &lbrack;CF&rsqb; 8C&Tab;Looking for Order

    状压模板题 CF难度2000? 我得好好了解一下CF的难度机制了 反正CF的难度比洛谷真实就好了 Code #include<algorithm> #include<iostream ...

  9. CF dp 题&lpar;1500-2000难度&rpar;

    前言 从后往前刷 update 新增 \(\text{\color{red}{Mark}}\) 标记功能,有一定难度的题标记为 \(\text{\color{red}{红}}\) 色. 题单 (刷过的 ...

随机推荐

  1. python之platform模块

    python之platform模块 ^_^第三个模块从天而降喽!! 函数列表 platform.system() 获取操作系统类型,windows.linux等 platform.platform() ...

  2. 我理解的this

    this指的就是当前上下文环境对象,主要分两种情况. 1.函数中的this指的是调用该函数的那个上下文环境对象 这个的理解还是非常重要的. 看一个全局函数的例子 var b = 1; function ...

  3. &lbrack;LeetCode&rsqb;题解(python):071-Simplify Path

    题目来源: https://leetcode.com/problems/simplify-path/ 题意分析: 简化Unix上的绝对路径,也就是多个'/'代表一个,'..'表示返回上一级目录,‘.' ...

  4. &lbrack;Swift&rsqb;LeetCode189&period; 旋转数组 &vert; Rotate Array

    Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: Input: ...

  5. js刷新页面的几种方式与区别

    Javascript刷新页面的几种方法:1 history.go(0) 2 location.reload() 3 location=location 4 location.assign(locati ...

  6. layui记录

    layui 官网 layui 独立版 layui mobile layui 社区

  7. &lbrack;LOJ6356&rsqb;四色灯

    [LOJ6356]四色灯 题目大意: 有\(n(n\le10^9)\)个编号\(1\sim n\)的格子和\(m(m\le20)\)个按钮.每个格子有一个初始为\(0\)的数,每个按钮有一个数字\(a ...

  8. VirtualBox下安装CentOS7系统

    本文假定你已经知道如何安装VirtualBox虚拟机软件,并且已经安装好了. 首先我们需要准备好centos的iso镜像文件,可以从centos的官网下载. 以下操作使用的VirtualBox版本号是 ...

  9. go语言爬虫 - TapTap用户都喜欢些什么游戏

    前面的废话 说到爬虫,首先想到的当然是python~ 它在机器学习.爬虫数据分析领域可谓是如日中天,十分热门.但我最近在学习go语言,所以就用go写了 TapTap社区 这是一个高品质的游戏分享社区, ...

  10. sitecore系统教程之默认收集数据库MongoDB注意事项

    MongoDB是一个高度可扩展的基于文档的NoSQL数据库解决方案,Sitecore体验数据库(xDB)用于收集数据库.在安装MongoDB之前,您应该考虑以下事项: 确定您是需要基于公共云的解决方案 ...