又是假算法基础训练营
只会4题,剩下一题被带的qwq
有没有大爷肯点个赞啊qwq
C
做法:模拟
签到题吧
其实就是for一遍如果\(a[i]!=a[i-1]+1\)那么肯定就是\(a[i-1]+1\)这个人缺席了(因为题目保证升序)
注意标记一下,如果没有找到符合要求的要输出\(n\),我因为这个被罚了1次
#include <bits/stdc++.h>
using namespace std;
#define N 200010
int n, a[N];
int main() {
scanf("%d", &n);
for(int i = 1; i < n; ++i) {scanf("%d", &a[i]);if(a[i]!=a[i-1]+1){printf("%d\n",a[i-1]+1);return 0;}}
printf("%d\n",n);
}
D
做法:简单贪心
容易想到一个错误的贪心:按B值排序。但是因为会产生贡献的是还没完成的题目,所以并没有这么简单(多了一个权重)。
那么考虑另外一种做法,如果做过国王游戏这题的话,应该不难想出来。
就是交换相邻位的贪心。
假设我们现在只有两个数,那么我们可以轻而易举的知道要先完成哪个任务(设两个任务为\(x\),\(y\),即\(x.a*y.b\)和\(y.a*x.b\)对比,值较小的后做。
那么我们可以推广到一般的情况,假设我们已经排序到了第\(k\)个数,\(1到k-1\)个数已经按上述规则排序完毕,那么只需要判断\(k\)和\(k-1\)的两值即可(因为前面已经有序了)。
可能我的语文水平不是很好...而且并没有很学术的证明这个东西(因为会很长)。
可以去看一下国王游戏这道题,并看一下这篇题解的证明。
其实这题核心就4行(也可以压到1行23333)
bool cmp(Node a, Node b) {
if(a.a * b.b < a.b * b.a) return 1;
return 0;
}
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 100010
int n;
ll sum;
struct Node {
int a, b;
ll val;
}a[N];
bool cmp(Node a, Node b) {
if(a.a * b.b < a.b * b.a) return 1;
return 0;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d%d", &a[i].a, &a[i].b);
}
ll ans = 0, t = 0;
sort(a + 1, a + n + 1, cmp);
for(int i = 1; i <= n; ++i) {
ans += 1ll * a[i].b * t;
t += a[i].a;
}
printf("%lld\n", ans);
}
E
做法:数学
小学数学题。
人脑模拟一下就会发现在\(m\)是奇数的情况下是\(n*m-2\)
至于偶数呢?人脑模拟一下\(m=2\)的情况会发现是\(n-1\)
人脑模拟一下\(m=4\)的情况会发现是\(3n-3\)
于是这题就做完了,\(m\)为偶数的答案是\(n*m-n-1\)
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m, T; scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
printf("%lld\n" ,1ll * n * m - (m & 1 ? 0 : (n - 1)) - 2);
}
return 0;
}
G
做法:数位dp
sb数位dp啊
什么,数位dp怎么写?我也不会啊
数位dp入门题不过比较遗憾的是之前没去学...所以就没写出来。
数位dp大概可以看这篇吧
其实这题我是抱大腿的说,所以还是不放代码了...要看代码去牛客找几个排名前面的大佬的G题看看就好。
I
真·签到题
做法:构造(猜结论)
首先你要看懂题意,然后这就是个sb题了。
其次,这头龙是使用的贪心策略,不是博弈策略(毕竟没有博弈题里面经常看到的绝顶聪明)
也就是说,它只会长出\(1\)的头来。
那么考虑我们如何构造出一个全0串。
考虑到龙的策略,我们有一种可行的构造方法:我们砍掉\(1\)的头之后还是让它长出\(1\)的头,而我们砍掉\(0\)的头也会长出\(1\)的头,这样我们可以得到一个全\(1\)串。然后我们砍这个全\(1\)串,因为没有\(0\)的头,所以在这个过程中龙都没办法决策,也就是说我们只要砍掉\(1\)的头后让它长出\(0\)的头就可以通过这个全\(1\)串构造出一个全\(0\)串
于是这题的正解就是输出\(cnznb\)...
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int T; scanf("%d", &T);
while(T--) {
puts("cnznb");
}
}
这次人均全场五题啊...
能不能进第一页全看手速,我靠手速混在30+名的样子...要不是因为CDE罚的有点多大概还能进个10多名...
不过G题没办法自己写出来有点遗憾qwq,还是要努力学新算法啊