赛后总结:
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);
}
}
来源:oschina
链接:https://my.oschina.net/u/4400327/blog/3544658