2019黑龙江省大学生程序设计竞赛 赛后总结
赛后总结:
T:今天比赛彭彭和金姐又来晚了。╭(╯^╰)╮然后我从最后开始看,最后一题又是熟悉的序列交换成有序数列,然后套一下我们的模板,然后就拿到首A了。接着跟榜看A题,花了几分钟搞一搞,然后因为爆int挖了一发,痛苦,以后要仔细看数据范围啊。然后金姐和彭彭看了E题做出来了,然后金姐看H题,听隔壁队伍口胡了快半小时。。。笑死我了。然后比他们先做出来了。最后我在看B题,组合数学题,不知道怎么处理大数阶乘,用java搞出来解,但是因为复杂度的问题,wa了,最后金姐和彭彭莫名其妙搞出了G题。太强了啊。如果会做更多组合数学题就好了呜呜。
题解:
A - A Count Task
简单字符串题
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<set> #include<string> #include<vector> #include<ctime> #include<map> #include<unordered_map> #include<time.h> #include<random> #include<stack> #include<cstdlib> using namespace std; typedef long long ll; #define mm(a,b) memset(a,b,sizeof(a)) const int maxn = 1e6 + 50; #define MAXN 1100 #define mod 100000007 const double eps = 1e-5; int main() { int T; scanf("%d", &T); while (T--) { string a; cin >> a; ll ans = 0; for (int i = 0; i < a.length(); ) { ll count = 1; char now = a[i]; for (int j = i + 1; j < a.length(); j++) { if (a[j] == now) count++; else break; } i += count; //if (count > 1) { ans += ((count + 1)*count) / 2; } } printf("%lld\n", ans); } return 0; }
E - A Hard Allocation
彭彭写题解!
G - Flower
金姐和彭彭写题解!
H - Overflow
金姐写题解!
J - The puzzle
题解:把数列交换成升序序列最小交换次数。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<set> #include<string> #include<vector> #include<ctime> #include<map> #include<unordered_map> #include<time.h> #include<random> #include<stack> #include<cstdlib> using namespace std; typedef long long ll; #define mm(a,b) memset(a,b,sizeof(a)) const int maxn = 1e6 + 50; #define MAXN 1100 #define mod 100000007 const double eps = 1e-5; int getMinSwaps(vector<int> &nums) { vector<int> nums1(nums); sort(nums1.begin(), nums1.end()); unordered_map<int, int> m; int len = nums.size(); for (int i = 0; i < len; i++) { m[nums1[i]] = i; } int loops = 0; vector<bool> flag(len, false); for (int i = 0; i < len; i++) { if (!flag[i]) { int j = i; while (!flag[j]) { flag[j] = true; j = m[nums[j]]; } loops++; } } return len - loops; } int main() { int T; scanf("%d", &T); while (T--) { int n; vector<int>arr; scanf("%d", &n); for (int i = 0; i < n; i++) { int id; scanf("%d", &id); arr.push_back(id); } int ans = getMinSwaps(arr); printf("%d\n", ans); } }