题目链接: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 }
题目链接: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 }