牛客寒假算法基础集训营3

又是算法基础训练营

只会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,还是要努力学新算法啊

官方题解

猜你喜欢

转载自www.cnblogs.com/henry-1202/p/10323696.html