题目:Opposites Attract

题目链接:https://vjudge.net/problem/CodeForces-131B

题目大意:

给出n个数,在这些数中若有成对相反数,则可以进行组合,数字可重复使用,0与0也可组合,问有多少种组合。

思路:

记录每个数出现的次数,可以用map,也可用桶(因为给出的数范围不大)。

解题代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <string>
 6 #include <cstring>
 7 #include <map>
 8 using namespace std;
 9 const long long N = 1e9 + 7;
10 typedef long long ll;
11 map <char,int> ma;
12 ll a[110];
13 ll b[110];
14 int main()
15 {
16     ll sum = 0;
17     ll n,num0 = 0,t;
18     cin >> n;
19     for(int i = 0;i < n;i++)
20     {
21         cin >> t;
22         if(t > 0)
23             a[t]++;
24         else if(t < 0)
25             b[abs(t)]++;
26         else
27             num0++;
28     }
29     for(int i = 1;i <= 10;i++)
30     {
31         if(a[i] && b[i])
32         {
33 
34             sum += a[i] * b[i];   //int*int 会爆,所以数组定义ll,被这个地方坑死了。
35             a[i] = 0;
36             b[i] = 0;
37         }
38     }
39     if(num0 > 1)
40         sum += num0 * (num0-1) / 2;
41     cout << sum << endl;
42 
43     return 0;
44 }

 

题目:Permutations

题目链接:https://vjudge.net/problem/CodeForces-124B

题目大意:

给出n个k位数,可以通过交换数位(一旦交换,所有是数都要交换数位),求出最大值与最小值的差最小的情况。

5237      交换前两位    2537
2753 ---------------> 7253

思路:

利用next_permutation,进行全排列,不断更新最小值就可。

解题代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <string>
 6 #include <cstring>
 7 #include <map>
 8 using namespace std;
 9 const long long N = 1e8 + 7;
10 typedef long long ll;
11 map <char,int> ma;
12 int x[8] = {0,1,2,3,4,5,6,7};  //因为题目上说了位数最大8位。
13 string s[10];
14 int main()
15 {
16     int n,k,minnum = N;
17     cin >> n >> k;
18     for(int i = 0;i < n;i++)
19         cin >> s[i];
20     do
21     {
22        int num[10] = {0};
23        for(int i = 0;i < n;i++)
24        {
25            for(int j = 0;j < k;j++)
26            {
27                num[i] *= 10;
28                num[i] += s[i][ x[j] ] - '0';
29            }
30 
31        }
32        sort(num,num+n);
33        minnum = min(minnum, num[n-1] - num[0]);
34     }while(next_permutation(x,x+k));
35 
36     cout << minnum << endl;
37     return 0;
38 }