codeforces # 317 div 2 B. Order Book（模拟）

B. Order Book
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

In this task you need to process a set of stock exchange orders and use them to create order book.

An order is an instruction of some participant to buy or sell stocks on stock exchange. The order number i has price pi, direction di — buy or sell, and integer qi. This means that the participant is ready to buy or sell qi stocks at price pi for one stock. A value qi is also known as a volume of an order.

All orders with the same price p and direction d are merged into one aggregated order with price p and direction d. The volume of such order is a sum of volumes of the initial orders.

An order book is a list of aggregated orders, the first part of which contains sell orders sorted by price in descending order, the second contains buy orders also sorted by price in descending order.

An order book of depth s contains s best aggregated orders for each direction. A buy order is better if it has higher price and a sell order is better if it has lower price. If there are less than s aggregated orders for some direction then all of them will be in the final order book.

You are given n stock exhange orders. Your task is to print order book of depth s for these orders.

Input

The input starts with two positive integers n and s (1 ≤ n ≤ 1000, 1 ≤ s ≤ 50), the number of orders and the book depth.

Next n lines contains a letter di (either ‘B’ or ‘S’), an integer pi (0 ≤ pi ≤ 105) and an integer qi (1 ≤ qi ≤ 104) — direction, price and volume respectively. The letter ‘B’ means buy, ‘S’ means sell. The price of any sell order is higher than the price of any buy order.

Output

Print no more than 2s lines with aggregated orders from order book of depth s. The output format for orders should be the same as in input.

Sample test(s)
input

output

Note

Denote (x, y) an order with price x and volume y. There are 3 aggregated buy orders (10, 3), (20, 4), (25, 10) and two sell orders (50, 8), (40, 1) in the sample.

You need to print no more than two best orders for each direction, so you shouldn’t print the order (10 3) having the worst price among buy orders.

应该３分钟过的题。。。

bc #52 div 2 B || hdoj 5418 Victor and World(tsp问题,状压dp)

dp[0][0] 表示要访问第一个国家且没有访问国人国家的时候的状态,此时花费为0

acm输出输出技巧（提交oj不需要改变）

，妈妈再也不用担心我累死在输入样例＆调试上了。。。

关于ACM的输入输出（一）

c++常用:

#include

ifstream filein(“data.in”);   // 定义一个文件输入流

ofstream fileout(“data.out”); //cout<< --> fileout<<

filein.eof() //文件到末尾,返回非零值

data.in表示输入的数据文件

c语言常用:

freopen(“date.in”,”r”,stdin);  //重定向所有标准的输入为文件输入

freopen(“date.out”,”w”,stdout);//重定向所有标准的输出为文件输出

fclose(stdout);//输出结束

freopen(“date.in”,”r”,stdin);  //重定向所有标准的输入为文件输入

freopen(“date.out”,”w”,stdout);//重定向所有标准的输出为文件输出

fclose(stdout);//输出结束

1、输入

#include
int main(void)
{
int a, b;
scanf(“%d %d”, &a, &b);
printf(“%d/n”, a + b);
return 0;

#include
int main(void)
{
int a, b;
while (scanf(“%d %d”, &a, &b) != EOF)
printf(“%d/n”, a + b);
return 0;

#include
int main(void)
{
int n, a, b;
scanf(“%d”, &n);
while (n–)
{
scanf(“%d %d”, &a, &b);
printf(“%d/n”, a + b);

return 0;

#include
int main(void)
{
int a, b;

while (scanf(“%d %d”, &a, &b), a || b)
printf(“%d/n”, a + b);

return 0;

#include
int main(void)
{
int a, b, i = 0;
while (scanf(“%d %d”, &a, &b), a || b)
printf((i++? “/n%d/n”: “%d/n”), a + b);
return 0;
}

1.知道输入数据组数n
scanf(“%d”,&n);
whlie(n–){
这里处理每一组输入.然后直接按格式输出,没必要开数组存储答案.
}
2.没有数据总数,以EOF结束
可能用的几个函数:
scanf():
while(scanf(“%s|%d”)!=EOF){
处理每一组数据,并输出.
}
getchar():读入一个字符
whlie((ch=getchar())!=EOF){

}
gets():读入一行
while(gets(buf)!=NULL) {

}
用getchar,gets注意读入换行符.
3.以0或-1结束的输入.
while(scanf(“%d”,&n),n!=0) {

}

cin读字符串时遇到空白符（空格，换行等）结束
char str[BUFFER];
while (cin >> str) {

getline读字符串时遇到换行符结束,用于读一整行
char str[BUFFER];
while (cin.getline(str, BUFFER)) {

string str;
while (getline(cin, str)) {

cin/cout要比scanf/printf慢一些，尽可能使用scanf/printf以避免测试大量数据时因为输入输出慢而导致TLE. putchar/getchar要比scanf/printf更快

String s;
while ((s = stdin.readLine()) != null) {
可以用StringTokenizer st = new StringTokenizer(s);来按空格切词
int n = Integer.parseInt(st.nextToken());
double b = Double.parseDouble(st.nextToken());

Scanner stdin = new Scanner(System.in);
while (stdin.hasNext()) {
String s = stdin.next();
int n = stdin.nextInt();
double b = stdin.nextDouble();

至于输出，很多新手总会选择先将答案存储在一个数组里，等程序运行完再输出，其实这是没有必要的，机器判决是逐个字符匹配，所以完全可以处理一组输入后，便输出结果。

ACM技巧 使用文件输入输出方便测试的方法

#include
#include

using namespace std;

#ifndef ONLINE_JUDGE
freopen(“in.txt”,”r”,stdin);
freopen(“out.txt”,”w”,stdout);
#endif

#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif

C语言输入输出函数详解

C语言中基本的输入输出函数有：
putchar ():把变量中的一个字符常量输出到显示器屏幕上;
getchar ();从键盘上输入一个字符常量,此常量就是该函数的值;
printf  ();把键盘中的各类数据,加以格式控制输出到显示器屏幕上;
scanf   ();从键盘上输入各类数据,并存放到程序变量中;
puts    ():把数组变量中的一个字符串常量输出到显示器屏幕上;
gets    ():从键盘上输入一个字符串常量并放到程序的数组中.
sscanf(); 从一个字符串中提取各类数据。

putchar() 和 getchar() 顾名思议就是从输入流中获取一个字符和输出一个字符，比较简单，不再多讲。

char c = getchar();
putchar(c);

printf():

printf(“格式控制”.输出列表);
eg : printf(“a=%d,b=%f,c=%c/n”,a,b,c);
1;格式控制.

2;输出列表

%的输出用两个连在一起的%%，即printf(“%%”);

d  以十进制形式输出带符号整数(正数不输出符号)
o  以八进制形式输出无符号整数(不输出前缀O)
x  以十六进制形式输出无符号整数(不输出前缀OX)
u  以十进制形式输出无符号整数
f  以小数形式输出单精度实数
lf以小数形式输出双精度实数
e  以指数形式输出单、双精度实数
g  以%f%e中较短的输出宽度输出单、双精度实数
c  输出单个字符
s  输出字符串

这里强调一下：网上很多文章都说f 和lf是一样的，即不管单精度，双精度浮点数，都可以用f, 但我在POJ上做过测试，输出Double时用f确实也可以 ，但读入时，用f就报WA，所以大家如果对Double进行读写的话，都用lf吧。说到Double，再啰嗦一句，建议大家要用到浮点数时都用Double，不要用float，因为在很多情况下，float精度不够会导致WA。

__int64    （注意int前面是两个下划线）

long long

用十进制整数来表示输出的最少位数。 注意若实际位数多于定义的宽度，则按实际位数输出， 若实际位数少于定义的宽度则补以空格或0。

精度格式符以“.”开头，后跟十进制整数。意义是：如果输出数字，则表示小数的位数；如果输出的是字符， 则表示输出字符的个数；若实际位数大于所定义的精度数，则截去超过的部分。

–  结果左对齐，右边填空格
+  输出符号(正号或负号)空格输出值为正时冠以空格，为负时冠以负号

double c=24212345.24232;
printf(“%020.4”);  表示输出精确到小数点后4位，输出占20位，若有空余的位补0.
scanf：
scanf的很多用法都是和printf对应的，故不再赘述。

int year,moth,day;
scanf(“%d-%d-%d”,&year,&moth,&day);

scanf(“%3d %*3d %2d”,&m,&n);      输入113 118 69回车(系统将113赋予m,将69赋予n,因为*号表示跳过它相应的数据所以118不赋予任何变量)
puts()用的不多，且基本都能用printf()代替，故不再多说。
gets()是从输入流中获取一行字符串放入字符数组中:
char in[100];
gets(in);

getchar(), scanf(“%c”); scanf(“%s”), gets()

scanf(“%d”,&n);
c = getchar();

scanf(“%d”,&n);
gets(str);

和以上不同的是，scanf(“%s”) 读入的时候是会忽略掉空格，回车和制表符的。并且以空格，回车和制表符作为字符串结束的标志。
经常会有这样的题，输入第一行是一个整数，接下来每行的第一个是一个字符，用来表示某种操作，后面再跟一些数据，比如：
4
A 100 2
B 23
A 23 89
B 34

char model[2];
Scanf(“%d”,&n);
for(…,…,…){
scanf(“%s”,model);
if(model[0] == ‘A’){
}
else{
}
}
sscanf():
sscanf()经常用来分解字符串，功能非常强大，但很多功能都需要正则表达式的知识，所以就介绍一下最简单的几种用法，大家如果想了解更多的话，自己去网上找吧。
1、
char str[100],str1[100],str2[100];
gets(str);
sscanf(str,”%s%s”,str1,str2);

2、

sscanf(“123456 “, “%4s”, str);
对于C++的输入输出就不再详细的讲了，因为cin,cout的速度实在太慢，不推荐使用，我一般都是到万不得已时才用。比如当你要读入字符串到string 对象中时，就只能用cin了，这时候还有一个常见的问题，就是如何将一整行字符串读入一个string 中，这就要用到getline函数了。

getline(cin, str);

cin.getline的用法如下：
char str[20];
cin.getline(str,20); 表示从读入的一行字符串中，取最多20各字符放入字符数组str中，注意此处的str是字符数组，而上面的str是string对象。
另外需要注意的是，千万不要把cout和printf混用，因为cout是带缓冲的而printf不带，所以会使得输出的数据顺序混乱。

下面是几个比较大的在线提交系统（Online Judge）里面有大量历年的竞赛题目，注册一个ID，然后用自己熟悉的语言（一般有Pascal/C/C++/Java）写好源代码提交即可，会实时返回信息告诉你是否正确。采用黑箱测试，系统里有一套标准的输入输出数据（对外保密，而且通常数据很多很怪），你的程序的输出和标准输出完全符合即可。常见的返回信息有AC（Accepted，通过）WA（Wrong Answer，输出有错误）TLE（Time Limit Exceeded，超时）MLE（Memory Limit Exceeded，内存溢出）RE（Runtime Error，发生实时错误）等，只有AC了才算做对一题。这里只是一个简要介绍，请大家在做题时先看看各网站上的FAQ，Enjoy it~~~

浙江大学 Online Judge（ZOJ）http://acm.zju.edu.cn

国内最早也是最有名气的OJ，有很多高手在上面做题。特点是数据比较刁钻，经常会有你想不到的边界数据，很能考验思维的全面性，现在我主要在这个OJ上做题

北京大学 Online Judge（POJ）http://acm.pku.edu.cn/JudgeOnline/

建立较晚，但题目加得很快，现在题数和ZOJ不相上下，特点是举行在线比赛比较多，数据比ZOJ上的要弱，有时候同样的题同样的程序，在ZOJ上WA，在POJ上就能AC

同济大学 Online Judge http://acm.tongji.edu.cn/index.php

这个OJ题数上不能与上两个相比，推荐这个OJ的原因是它是中文的，这对很多对英文不太感冒的兄弟是个好消息吧。它也因此吸引了众多高中的OIer，毕竟他们的英文还差一些呵呵，上面的题目也更偏向高中的信息学竞赛一些。

世界上最大最有名的OJ，题目巨多而且巨杂，数据也很刁钻，全世界的顶尖高手都在上面。据说如果你能在UVA上AC一千道题以上，就尽管向IBM、微软什么的发简历吧，绝对不会让你失望的。

俄罗斯Ural立大学 Online Judge（URAL）http://acm.timus.ru/

也是一个老牌的OJ，题目不多，但题题经典，我在高中的时候就在这上面做题的。

UsacoGate Online Judge（USACO）http://ace.delos.com/usacogate

全美计算机奥林匹克竞赛（USACO）的训练网站，特点是做完一关才能继续往下做，与前面的OJ不同的是测试数据可以看到，并且做对后可以看标准解答，所以如果大家刚开始的时候在上面那些OJ上总WA却找不到原因的话，可以试着来这里做做，看看测试数据一般是从什么地方阴你的。

POJ【数论/组合/博弈论】题目列表

POJ【数论/组合/博弈论】题目列表

POJ 2234 Matches Game
POJ 2975 Nim
POJ 2505 A multiplication game
POJ 1067 取石子游戏　　威佐夫博弈，奇异局势（必败局）为ak = [k*(1 + sqrt(5))/2], bk = ak + k;
POJ 2484 A Funny Game　　这题真欢乐
POJ 2425 A Chess Game
POJ 2960 S-Nim    sg函数
POJ 1704 Georgia and Bob 阶梯博弈转化成Nim，当N为奇数时将p[1]与0绑定
POJ 1740 A New Stone Game
POJ 2068 Nim
POJ 3480 John    Anti-SG问题 贾志豪的论文Chapter2

POJ 2348 Euclid’s Game
POJ 3710 Christmas Game
POJ 3533 Light Switching Game
POJ 3537 Crosses and Crosses

1.burnside定理，polya计数法
这个大家可以看brudildi的《组合数学》，那本书的这一章写的很详细也很容易理解。最好能完全看懂了，理解了再去做题，不要只记个公式。
*简单题：（直接用套公式就可以了）
pku2154 Color
*强烈推荐：（这题很不错哦，很巧妙）
pku2888 Magic Bracelet
2.置换，置换的运算

置换的概念还是比较好理解的，《组合数学》里面有讲。对于置换的幂运算大家可以参考一下潘震皓的那篇《置换群快速幂运算研究与探讨》，写的很好。
*简单题：（应该理解概念就可以了）
pku3270 Cow Sorting
pku1026 Cipher
*置换幂运算：
pku1721 CARDS
pku3128 Leonardo’s Notebook
*推荐：（不错的应用）
pku3590 The shuffle Problem
3.素数，整数分解，欧拉函数

素数是可能数论里最永恒，最经典的问题了（我们的队名就叫PrimeMusic^-^）。素数的判断，筛法求素数，大素数的判断···还有很多其他问题都会用到素数。
*最水最水的：（心情不爽时用来解闷吧）
pku1365 Prime Land
pku2034 Anti-prime Sequences
pku2739 Sum of Consecutive Prime Numbers
pku3518 Prime Gap
pku3126 Prime Path
pku1595 Prime Cuts
pku3641 Pseudoprime numbers
pku2191 Mersenne Composite Numbers
pku1730 Perfect Pth Powers
pku2262 Goldbach’s Conjecture
pku2909 Goldbach’s Conjecture
*筛法：
pku2689 Prime Distance（很好的一个应用）
*反素数：
zoj2562 More Divisors
*素数判断，整数分解：
这两题都要用到miller_rabin的素数判断和pollard_rho的整数分解，算法书上都会有，应该是属于模板题吧，不过最好看懂自己敲一遍。
pku1811 Prime Test
pku2429 GCD & LCM Inverse

*欧拉函数：
数论里很多地方都能用到欧拉函数，很重要的。
pku1284 Primitive Roots （关于原根的定理：p的原根为euler(euler(p))，本题中当p为奇素数时euler(p)=p-1，故答案为euler(p-1)）
pku2407 Relatives （很水）
pku2773 Happy 2006
pku2478 Farey Sequence （快速求欧拉函数）
pku3090 Visible Lattice Points （法雷级数）
*推荐：（欧拉函数，费马小定理）
pku3358 Period of an Infinite Binary Expansion
*整数分解
这个也很重要的耶，包括大数的表示方法。
pku2992 Divisors
pku3101 Astronomy （分数的最小公倍数）
4.扩展欧几里得，线性同余，中国剩余定理

这应该是数论里比较重要的一个部分吧，这类的题目也挺多，具体的内容最好先看看数论书，我也整理过一些，可以参考参考：
*简单题：
pku1006 Biorhythms
pku1061 青蛙的约会
pku2891 Strange Way to Express Integers
pku2115 C Looooops
pku2142 The Balance
*强烈推荐：
sgu106 The equation
pku3708 Recurrent Function （经典）
5.约瑟夫环问题

这个问题还是比较有意思的，不是很难。
*简单题：
pku3517 And Then There Was One
pku1781 In Danger
pku1012 Joseph
pku2244 Eeny Meeny Moo
*推荐：
pku2886 Who Gets the Most Candies?
6.高斯消元法解方程

其实解方程并不是很难，就是按线性代数中学的那种方法，把系数矩阵化成上三角矩阵或数量矩阵，不过有些题目要判断是否有解，或枚举所有解。不过这类题目我认为比较难的还是怎么去建立这个方程组，这个理解了，就没什么大问题了。
*简单题：
pku1222 EXTENDED LIGHTS OUT
pku1681 Painter’s Problem
pku1830 开关问题
*推荐：
pku2947 Widget Factory
pku2065 SETI
*强烈推荐：
pku1753 Flip Game
pku3185 The Water Bowls
*变态题：
pku1487 Single-Player Games

7.矩阵
用矩阵来解决问题确实很常见，但我现在用到还不是很好，很多难题我还不会做。建议大家可以去看Matrix67的那篇关于矩阵的十个问题，确实很经典，但不太好看懂。
*简单：
pku3070 Fibonacci
pku3233 Matrix Power Series
pku3735 Training little cats
8.高次同余方程

有关这个问题我应该是没什么发言权了，A^B%C=D，我现在只会求D和B，唉，很想知道A该怎么求。就先推荐几道题目吧，这里涉及到了一个baby-step，giant-step算法。
pku3243 Clever Y
pku2417 Discrete Logging
9.容斥原理，鸽巢原理

很有用的两个定理，但好像单独考这两个定理的不是很多。
*鸽巢原理：
pku2356 Find a multiple
pku3370 Halloween treats
*容斥原理：
hdu1695 GCD
hdu2461 Rectangles
10.找规律，推公式

这类题目的设计一般都非常巧妙，真的是很难想出来，但只要找到规律或推出公式，就不是很难了。我很多都是在参考别人思路的情况下做的，能自己想出来真的很不容易。
*个人感觉都挺不错的：
pku3372 Candy Distribution
pku3244 Difference between Triplets
pku1809 Regetni
pku1831 不定方程组
pku1737 Connected Graph
pku2480 Longge’s problem
pku1792 Hexagonal Routes
11.排列组合，区间计数，计数序列

这些题目可能需要一些组合数学知识，基本上高中的知识就够了。区间计数问题一般不难，但写的时候需要仔细一些，各种情况要考虑到位。至于像卡特兰数，差分序列，斯特灵数···都还挺有意思，可以去看看《组合数学》。
*简单题：
pku1850 Code
pku1150 The Last Non-zero Digit
pku2282 The Counting Problem
pku3286 How many 0’s?
*推荐：
pku3252 Round Numbers
*计数序列：
pku1430 Binary Stirling Numbers
pku2515 Birthday Cake
pku1707 Sum of powers
12.二分法

二分的思想还是很重要的，这里就简单推荐几个纯粹的二分题。
*简单：
pku3273 Monthly Expense
pku3258 River Hopscotch
pku1905 Expanding Rods
pku3122 Pie
*推荐：
pku1845 Sumdiv
13.稳定婚姻问题

无意中接触到这个算法，还蛮有意思的，《组合数学》中有详细的介绍。
pku3487 The Stable Marriage Problem
zoj1576 Marriage is Stable
14.数位类统计问题

在航点月赛中第一次接触到这类问题，scau大牛little龙推荐我看了一篇论文，09年刘聪的《浅谈数位类统计问题》，这篇论文相当精彩，也相当详 细，每道题都有详细的分析和作者的参考代码。所以我也没什么可说的了，这些题的代码我博客里也就不贴了，大家直接去看论文吧。
简单：
ural1057 Amount of degrees
spoj1182 Sorted bit squence
hdu3271 SNIBB
较难：
spoj2319 Sequence
sgu390 Tickets

水题

poj 1305 (毕达哥拉斯三元组，构造勾股数)

a=s*t,b=(s^2-t^2)/2,c=(s^2+t^2)/2

case:(3,4,5) (5,12,13) (8,15,17) (7,24,25) (20,21,29)(9,40,41)(12,35,37)(11,60,61)(28,45,53) (33,56,65) (16,63,65)

3² = 5² – 4² = (5-4)(5+4) = 1 × 9

15² = 17²-8² = (17-8)(17+8) = 9 ×25

35² = 37² – 12² = (37-12)(37+12) = 25 ×49

……

c=（s²+t²)/2, b=(s²-t²)/2,a = √(c-b)(c+b) = st.这就得出了勾股数组定理：

poj 3370 Halloween treats (剩余类,抽屉原理)

设这n个自然数分别为a1,a2,a3,a4….an
处理一个前缀和sum[i] = (sum[i-1] + a[i])%n
因为n的剩余类有n种,分别为0,1,2…n-1
所以sum[1],sum[2],sum[3]..sum[n]
那么sum[1],sum[2],sum[3]…sum[n]最多也有n种.
我们分情况讨论:
(1)sum[1],sum[2],sum[3]…sum[n]互不相同,那么一定存在sum[i]=0,也就是前i个数的和为n的倍数.
(2)情况(1)的反面,也就是存在sum[i]==sum[j]  (i<j),那么 从a[i+1] 到 a[j]的和就是n的倍数.

HUST team contest #E A Mountain Road||poj 3846 (dp)

dp[i][j][0..1]表示已经经过了a方向的i辆车,经过了b方向的j辆车,并且最后一辆车是a/b方向的情况的离开道路的时间.

wa到怀疑人生好么!!!

dp数组初始化赋值成正无穷的时候,溢出啦!

0x3f3f3f3f的每个字节都是0x3f！所以要把一段内存全部置为无穷大，我们只需要memset(a,0x3f,sizeof(a))

0x3f3f3f3f…编程中无穷大常量的设置技巧

1. 很多时候我们并不只是单纯拿无穷大来作比较，而是会运算后再做比较，例如在大部分最短路径算法中都会使用的松弛操作：
if (d[u]+w[u][v]我们知道如果u,v之间没有边，那么w[u][v]=INF，如果我们的INF取0x7fffffff，那么d[u]+w[u][v]会溢出而变成负数，我们的松弛操作便出错了，更一般的说，0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”，它变成了一个很小的负数。
2. 除了要满足加上一个常数依然是无穷大之外，我们的常量还应该满足“无穷大加无穷大依然是无穷大”，至少两个无穷大相加不应该出现灾难性的错误，这一点上0x7fffffff依然不能满足我们。

1. 0x3f3f3f3f的十进制是1061109567，也就是10^9级别的（和0x7fffffff一个数量级），而一般场合下的数据都是小于10^9的，所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
2. 另一方面，由于一般的数据都不会大于10^9，所以当我们把无穷大加上一个数据时，它并不会溢出（这就满足了“无穷大加一个有穷的数依然是无穷大”），事实上0x3f3f3f3f+0x3f3f3f3f=2122219134，这非常大但却没有超过32-bit int的表示范围，所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。
3. 最后，0x3f3f3f3f还能给我们带来一个意想不到的额外好处：如果我们想要将某个数组清零，我们通常会使用memset(a,0,sizeof(a))这样的代码来实现（方便而高效），但是当我们想将某个数组全部赋值为无穷大时（例如解决图论问题时邻接矩阵的初始化），就不能使用memset函数而得自己写循环了（写这些不重要的代码真的很痛苦），我们知道这是因为memset是按字节操作的，它能够对数组清零是因为0的每个字节都是0，现在好了，如果我们将无穷大设为0x3f3f3f3f，那么奇迹就发生了，0x3f3f3f3f的每个字节都是0x3f！所以要把一段内存全部置为无穷大，我们只需要memset(a,0x3f,sizeof(a))。

HUST team contest #2 C Divisible Subsequences ||poj 3844 (剩余类)

a[i] 到 a[j]的和为 sum[j]-sum[i-1]

HUST team contest #2 A An Industrial Spy ||poj 3842 (筛)

STL中求全排列的那个函数我也不是没用过。。。比赛的时候怎么就没想到==

pascal的时候倒是写过几次呢。

http://blog.csdn.net/dinosoft/article/details/5829550