3487: 物品传递-【2014暑期训练】T5Day2T2

内存限制:256 MB 时间限制:1 S 标准输入输出
题目类型:传统 评测方式:文本比较 上传者:
提交:1 通过:1

题目描述

物品传递

【问题描述】

n个人在做传递物品的游戏,人的编号为1到n。

游戏规则如下:

(1)开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位;

(2)当前接到物品的人可以将物品传递给未接到过物品的任意一人。

即物品只能经过同一个人一次,而且每次传递过程都有一个代价。

求当物品经过所有n个人后,整个过程的总代价是多少。

【文件输入】

第一行为n,表示共有n个人(16>=n>=2);

以下为n*n的矩阵,第i+1行、第j列表示物品从编号为i的人传递到编号为j的人所花费的代价,特别的有第i+1行、第i列为-1(因为物品不能自己传给自己),其他数据均为正整数(<=10000)。

【文件输出】

一个数,为最小的代价总和。

【输入样例】

4

-1 9998 9997 9999

9999 -1 9997 9997

9997 9999 -1 9998

9999 9998 9999 -1

【输出样例】

29992

【数据规模】

对于50%的数据,n<=11;

对于100%的数据,n<=16。

数据范围与提示


去掉最后一位 | (101101->10110) | x shr 1

  在最后加一个0 | (101101->1011010) | x shl 1

  在最后加一个1 | (101101->1011011) | x shl 1+1

  把最后一位变成1 | (101100->101101) | x or 1

  把最后一位变成0 | (101101->101100) | x or 1-1

  最后一位取反 | (101101->101100) | x xor 1

  把右数第k位变成1 | (101001->101101,k=3) | x or (1 shl (k-1))

  把右数第k位变成0 | (101101->101001,k=3) | x and not (1 shl (k-1))

  右数第k位取反 | (101001->101101,k=3) | x xor (1 shl (k-1))

  取末三位 | (1101101->101) | x and 7

  取末k位 | (1101101->1101,k=5) | x and (1 shl k-1)

  取右数第k位 | (1101101->1,k=4) | x shr (k-1) and 1

  把末k位变成1 | (101001->101111,k=4) | x or (1 shl k-1)

  末k位取反 | (101001->100110,k=4) | x xor (1 shl k-1)

  把右边连续的1变成0 | (100101111->100100000) | x and (x+1)

  把右起第一个0变成1 | (100101111->100111111) | x or (x+1)

  把右边连续的0变成1 | (11011000->11011111) | x or (x-1)

  取右边连续的1 | (100101111->1111) | (x xor (x+1)) shr 1

  去掉右起第一个1的左边 | (100101000->1000) | x and (x xor (x-1))

  最后这一个在树状数组中会用到。

  PascalC中的16进制表示

  Pascal中需要在16进制数前加$符号表示,C中需要在前面加0x来表示。这个以后我们会经常用到。