背景 Background
太原成成中学第2次模拟赛 第二道
描述 Description
给出2个序列A={a[1],a[2],…,a[n]},B={b[1],b[2],…,b[n]},从A、B中各选出n个元素进行一一配对(可以不按照原来在序列中的顺序),并使得所有配对元素差的绝对值之和最大。
输入格式 InputFormat
输入的第1行为1个整数n
第2行包含n个整数,题目中的A序列。
第3行包含n个整数,题目中的B序列。
第2行包含n个整数,题目中的A序列。
第3行包含n个整数,题目中的B序列。
输出格式 OutputFormat
一个数,最大配对
代码:
01 | #include <stdio.h> |
02 | #include <string.h> |
03 | int f[1010]; |
04 | void S( int f[], int x, int y) |
05 | { |
06 | int t=f[x],t1=f[y]; |
07 | for ( int i=0;i<1010;i++) |
08 | if (f[i]==t) f[i]=t1; |
09 | } |
10 | int main() |
11 | { |
12 | /* |
13 | 通过集合关系来表示本身的两人之间是否有着间接关系 |
14 | 当已知两人对应数组中数字都为1时,表明两人已经认识, |
15 | 故:再进行两人间的关系描述是冗余的。 |
16 | */ |
17 | int num; |
18 | int n,i,m,x,y; |
19 | while ( scanf ( "%d %d" ,&n,&m)!=EOF) |
20 | { |
21 | for (i=0;i<1010;i++) f[i]=i; |
22 | num=0; |
23 | for (i=0;i<n;i++) |
24 | { |
25 | scanf ( "%d %d" ,&x,&y); |
26 | if (f[x]==f[y]) num++; |
27 | else {S(f,x,y);} |
28 | } |
29 | printf ( "%d\n" ,num); |
30 | } |
31 | return 0; |
32 | } |