赛后总结:
T:今天比赛彭彭和金姐又来晚了。╭(╯^╰)╮然后我从最后开始看,最后一题又是熟悉的序列交换成有序数列,然后套一下我们的模板,然后就拿到首A了。接着跟榜看A题,花了几分钟搞一搞,然后因为爆int挖了一发,痛苦,以后要仔细看数据范围啊。然后金姐和彭彭看了E题做出来了,然后金姐看H题,听隔壁队伍口胡了快半小时。。。笑死我了。然后比他们先做出来了。最后我在看B题,组合数学题,不知道怎么处理大数阶乘,用java搞出来解,但是因为复杂度的问题,wa了,最后金姐和彭彭莫名其妙搞出了G题。太强了啊。如果会做更多组合数学题就好了呜呜。
P:E题是一道水题,然而打的时候还是不必要的WA了一次(傻的判断条件写错了。。还自己没找到,金姐看到的)。G题首先的想法以为只会有两种不同的数字,然而思路是错的,被金姐推翻。后来。。就跟这道题杠上了,然后突发奇想,逆向思维向上推,受金姐启发,在思路不完全清晰的情况下,找到了能够应征大家之前所有例子的正确解,然后金姐就打了,就A了之后都还不是特别明白为什么。直到结束,问了隔壁队。
J:H题也是一道水题,但是刚开始样例没看懂,结果听隔壁队口胡,突然就看懂了,但是后来想复杂了,想到万一水不够木块浮起来怎么办,把隔壁队也给带歪了,最后看到A了那么多人,应该没那么复杂,就A了
题解:
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
题解:最优的解法是将蛋糕均分给大家,直到没有蛋糕,如果蛋糕是人数的倍数就是差值为0,否则差值为1
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<string> 9 #include<vector> 10 #include<ctime> 11 #include<map> 12 #include<unordered_map> 13 #include<time.h> 14 #include<random> 15 #include<stack> 16 #include<cstdlib> 17 using namespace std; 18 typedef long long ll; 19 #define mm(a,b) memset(a,b,sizeof(a)) 20 const int maxn = 1e6 + 50; 21 #define MAXN 1100 22 #define mod 100000007 23 const double eps = 1e-5; 24 int main() 25 { 26 int T; 27 scanf("%d", &T); 28 while (T--) 29 { 30 int n, m; 31 scanf("%d %d", &n, &m); 32 if (n%m==0) 33 printf("0\n"); 34 else 35 printf("1\n"); 36 } 37 return 0; 38 }
G - Flower
题解:题目要求的是,能否将所有花砍刀一样高,如果可以,最少需要砍的次数是几次。
由于,每砍一次,需要砍n-1朵花,因此这就相当于将n朵中的其中一朵给它增加1的高度。因此,这道题目就可以演变成问你加多少次能使花的高度一样。因为,每次只能增加一朵花的1高度,因此增加的次数就是将n朵花中最高的那朵与其他的花的差值的和。此时,还需要考虑,n朵花是否有足够的高度让我们砍那么多次和砍那么多次,是否能得到平均的高度。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<string> 9 #include<vector> 10 #include<ctime> 11 #include<stack> 12 using namespace std; 13 typedef long long ll; 14 #define mm(a,b) memset(a,b,sizeof(a)) 15 #define MAXN 100010 16 #define inf 0x3f3f3f3f 17 int n, a[MAXN]; 18 int main() 19 { 20 int t; 21 ll sum; 22 ll ans; 23 scanf("%d", &t); 24 while (t--) 25 { 26 sum = 0; 27 ans = 0; 28 scanf("%d", &n); 29 for (int i = 0; i < n; ++i) 30 { 31 scanf("%d", &a[i]); 32 sum += a[i]; 33 } 34 sort(a, a + n); 35 for (int i = 0; i < n; ++i) 36 ans += a[n - 1] - a[i]; 37 if ((sum - ans * (n - 1)) % n || (sum - ans * (n - 1)) / n <= 0) 38 printf("-1\n"); 39 else printf("%d\n", ans); 40 } 41 }
H - Overflow
题解,根据木块的密度,判断木块能不能浮起来,浮起来的话水增加的体积为L^3*P,否则谁增加的体积为L^3
#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 10010 #define mod 100000007 const double eps = 1e-5; int main() { int t, n; double l[MAXN], p[MAXN], s, v, h; double sum = 0; scanf("%d", &t); while (t--) { scanf("%d", &n); sum = 0; for (int i = 0; i < n; ++i) { scanf("%lf%lf", &l[i], &p[i]); if (p[i] >= 1) sum += l[i] * l[i] * l[i]; else sum += l[i] * l[i] * l[i] * p[i]; } scanf("%lf%lf%lf", &s, &h, &v); sum += v; printf("%.2f\n", min(h, sum / s)); } }
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); } }