比赛链接:http://acm.bnu.edu.cn/v3/contest_show.php?cid=6869
A:字典序输出三个数的排列
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 20 using namespace std; 21 22 int a[3]; 23 24 int main() { 25 // freopen("in", "r", stdin); 26 int kase = 0; 27 int T_T; 28 scanf("%d", &T_T); 29 while(T_T--) { 30 scanf("%d %d %d", &a[0], &a[1], &a[2]); 31 printf("Case #%d: ", ++kase); 32 sort(a, a+3); 33 if(a[0] == a[2]) { 34 printf("%d %d %d ", a[0], a[0], a[0]); 35 } 36 else if(a[0] == a[1]) { 37 printf("%d %d %d ", a[0], a[1], a[2]); 38 printf("%d %d %d ", a[1], a[2], a[0]); 39 printf("%d %d %d ", a[2], a[1], a[0]); 40 } 41 else if(a[1] == a[2]) { 42 printf("%d %d %d ", a[0], a[1], a[2]); 43 printf("%d %d %d ", a[1], a[0], a[2]); 44 printf("%d %d %d ", a[2], a[1], a[0]); 45 } 46 else { 47 printf("%d %d %d ", a[0], a[1], a[2]); 48 printf("%d %d %d ", a[0], a[2], a[1]); 49 printf("%d %d %d ", a[1], a[0], a[2]); 50 printf("%d %d %d ", a[1], a[2], a[0]); 51 printf("%d %d %d ", a[2], a[0], a[1]); 52 printf("%d %d %d ", a[2], a[1], a[0]); 53 } 54 } 55 }
C.小学数学的数的组合问题
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 20 using namespace std; 21 22 const int maxn = 100010; 23 int n, m, q, x; 24 25 int main() { 26 // freopen("in", "r", stdin); 27 int kase = 0; 28 int T_T; 29 scanf("%d", &T_T); 30 while(T_T--) { 31 scanf("%d %d %d", &n, &m, &q); 32 printf("Case #%d: ", ++kase); 33 for(int i = 0; i < q; i++) { 34 scanf("%d", &x); 35 if(x <= n && x < m) { 36 printf("%d ", x-1); 37 } 38 else if(x > n + m) { 39 printf("%d ", 0); 40 } 41 else if(x > n && x <= m){ 42 printf("%d ", n); 43 } 44 else if(x <= n && x > m) { 45 printf("%d ", m); 46 } 47 else if(x > n && x > m) { 48 printf("%d ", n + m - x + 1); 49 } 50 else { 51 printf("%d ", x - 1); 52 } 53 } 54 } 55 }
K.判断四个点围成的图形是什么
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 20 using namespace std; 21 22 typedef struct Point { 23 int x; 24 int y; 25 friend bool operator ==(Point a, Point b) { 26 return a.x == b.x && a.y == b.y; 27 } 28 }; 29 30 Point p[4]; 31 32 bool reapeat() { 33 int i = 0, j; 34 for(; i < 4; i++) { 35 for(j = i+1; j < 4; j++) { 36 if(p[i] == p[j]) { 37 break; 38 } 39 } 40 if(j != 4) { 41 break; 42 } 43 } 44 return i != 4; 45 } 46 47 bool par() { 48 int a = (p[1].y - p[0].y) * (p[3].x - p[2].x); 49 int b = (p[1].x - p[0].x) * (p[3].y - p[2].y); 50 int c = (p[2].x - p[1].x) * (p[3].y - p[0].y); 51 int d = (p[3].x - p[0].x) * (p[2].y - p[1].y); 52 if(a != b) { 53 return false; 54 } 55 return c == d; 56 } 57 58 bool rec() { 59 int a = (p[0].x - p[2].x) * (p[0].x - p[2].x) + (p[0].y - p[2].y) * (p[0].y - p[2].y); 60 int b = (p[1].x - p[3].x) * (p[1].x - p[3].x) + (p[1].y - p[3].y) * (p[1].y - p[3].y); 61 return a == b; 62 } 63 64 bool dia() { 65 int a = (p[0].y - p[2].y) * (p[1].y - p[3].y); 66 int b = (p[1].x - p[3].x) * (p[0].x - p[2].x); 67 return a == -b; 68 } 69 70 int main() { 71 // freopen("in", "r", stdin); 72 int kase = 0; 73 int T_T; 74 scanf("%d", &T_T); 75 while(T_T--) { 76 printf("Case #%d: ", ++kase); 77 for(int i = 0; i < 4; i++) { 78 scanf("%d %d", &p[i].x, &p[i].y); 79 } 80 if(reapeat()) { 81 printf("Others "); 82 } 83 else { 84 if(par()) { 85 bool flag1 = rec(); 86 bool flag2 = dia(); 87 if(flag1 && flag2) { 88 printf("Square "); 89 } 90 else if(!flag1 && !flag2) { 91 printf("Parallelogram "); 92 } 93 else if(flag1) { 94 printf("Rectangle "); 95 } 96 else if(flag2) { 97 printf("Diamond "); 98 } 99 } 100 else { 101 printf("Others "); 102 } 103 } 104 } 105 }
A题新姿势:哈希去重
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 20 using namespace std; 21 22 const int maxn = 1000; 23 typedef unsigned long long ull; 24 const int B = 100007; 25 int n; 26 int vis[maxn]; 27 int ans[maxn]; 28 int num[maxn]; 29 set<ull> has; 30 31 void solve1(int cur) { 32 if(cur == n) { 33 ull ah = 0; 34 for(int i = 0; i < n; i++) { 35 ah = ah * B + ans[i]; 36 } 37 if(has.find(ah) == has.end()) { 38 has.insert(ah); 39 for(int i = 0; i < n; i++) { 40 printf("%d", ans[i]); 41 if(i < n-1) printf(" "); 42 else printf(" "); 43 } 44 } 45 return ; 46 } 47 for(int i = 0; i < n; i++) { 48 if(!vis[i]) { 49 vis[i] = 1; 50 ans[cur] = num[i]; 51 solve1(cur + 1); 52 vis[i] = 0; 53 } 54 } 55 56 } 57 58 int main() { 59 // freopen("in", "r", stdin); 60 int T_T; 61 scanf("%d", &T_T); 62 n = 3; 63 for(int _ = 1; _ <= T_T; _++) { 64 has.clear(); 65 scanf("%d %d %d", &num[0], &num[1], &num[2]); 66 printf("Case #%d: ", _); 67 memset(vis, 0, sizeof(vis)); 68 sort(num, num+n); 69 solve1(0); 70 } 71 }