牛客ioi周赛20——普及组

完全数

题意: 判断一个数的不包括其本身的约数和与其本身的大小关系。
数据范围:

题解: 枚举到暴力求解即可。
代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
ll n;
int main()
{
    scanf("%lld", &n);
    ll res = 0;
    int last = sqrt(n + 0.5);
    for(int i = 1; i <= last; ++i) {
        if(n % i == 0) {
            res += i;
            if(1ll * i * i != n) res += n / i;
        }
    }
    res -= n;
    if(res == n) puts("Pure");
    else if(res < n) puts("Early");
    else puts("Late");
    return 0;
}

移动撤销

题意: 初始在,给定移动的序列,问移动完所在点的坐标。
数据范围:

题解:
用一个数组记录所走的还没被撤销的序列,表示当前所在点是已经走过的第几个点。若是就正常按照方向走,然后更新数组,若是就判断是否有路可退即可。

代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
char s[N];
int la[N];
int n, last;
int dx[] = {0, -1, 0, 1};
int dy[] = {1, 0, -1, 0};

int id(char ch) {
    if(ch == 'W') return 0;
    if(ch == 'A') return 1;
    if(ch == 'S') return 2;
    if(ch == 'D') return 3;
    return -1;
}

int main()
{
    scanf("%d", &n);
    scanf("%s", s);
    last = -1; 
    int x = 0, y = 0;
    for(int i = 0; i < n; ++i) {
        if(s[i] == 'Z') {
            if(~last) {
                x -= dx[la[last]], y -= dy[la[last]];
                --last;
            }
        }
        else {
            la[++last] = id(s[i]);
            x += dx[la[last]], y += dy[la[last]];
        }
    }
    printf("%d %d\n", x, y);
}

石头剪刀布

题意: 给定牛牛和牛妹所出的石头剪刀和布的次数,问牛牛最多可以赢多少分。
题解: 考虑牛牛的石头剪刀和布可以赢牛妹对应的箭头布和石头多少次,这里是得分两次的情况,考虑完后删除,再考虑牛牛和牛妹对应可以打平的次数,这里打平一次得一分,即为最终答案。

代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n; cin >> n;
    int a[2], b[2], c[2];
    cin >> a[1] >> b[1] >> c[1];
    cin >> a[2] >> b[2] >> c[2];

    int res = 0;
    int mn = min(a[1], b[2]);
    res += mn * 2;
    a[1] -= mn, b[2] -= mn;

    mn = min(b[1], c[2]);
    res += mn * 2;
    b[1] -= mn, c[2] -= mn;

    mn = min(c[1], a[2]);
    res += mn * 2;
    c[1] -= mn, a[2] -= mn;

    res += min(a[1], a[2]) + min(b[1], b[2]) + min(c[1], c[2]);

    cout << res << "\n";

    return 0;
}

夹缝中求和

题意: 给定序列,问的数对个数,其中
数据范围:

题解: 考虑枚举的时候,只在其左边枚举。此时左边的需满足。经典树状数组,先离散化然后再枚举每个即可。

代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10, M = N * 3;
int a[N], n, x ,y;
int tr[M];
vector<int> b;
void add(int p, int x) {
    for(int i = p; i < M; i += (i & -i)) tr[i] += x;
}

int sum(int p) {
    int res = 0;
    for(int i = p; i >= 1; i -= (i & -i)) res += tr[i];
    return res;
}

int get(int x) {
    return lower_bound(b.begin(), b.end(), x) - b.begin() + 1;
}

int main()
{
    scanf("%d%d%d", &n, &x, &y);
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);


    for(int i = 1; i <= n; ++i) {
        b.push_back(a[i]);
        b.push_back(x - a[i]);
        b.push_back(y - a[i]);
    }

    sort(b.begin(), b.end());
    b.erase(unique(b.begin(), b.end()), b.end());

    long long res = 0;
    for(int i = 1; i <= n; ++i) {
        int l = get(x - a[i]);
        int r = get(y - a[i]);
        res += sum(r) - sum(l - 1);
        add(get(a[i]), 1);
    }

    printf("%lld\n", res);

    return 0;
}
全部评论

相关推荐

10-17 16:48
已编辑
南方科技大学 图像识别
记录一下找工作的感受吧。鼠鼠硕士阶段搞的图像处理,用了深度学习比较成熟、简单的模型,技能点主要在科研上研二下学期准备找工作,先投AI、机器学习的暑期实习,没有结果。当时不想投开发,觉得太累了。后面找不到工作,就转开发了。但是八股不会,刷题不精,挂了好多笔试面试。在一个线下宣讲会获得了一个小科技公司的日常实习机会。我的实习公司,70%是应届生,共同话题很多。我问了算法部门刚入职的同事,一位同事硕士阶段和我的成果差不多。他们毕业院校一般,觉得算法很难,之后想换工作。我也有几个985硕科班算法的朋友,他们去找工作🈚压力。我等凡人不跟他们竞争了。工位旁还有几位java开发工程师,我需要他们提供接口给我,大概也了解了他们的工作内容。一个同事说弄懂java虚拟机最重要。而我看那些知识点觉得很枯燥,我想我还是稍喜欢现在的工作,主要画画ui。鼠鼠也蛮喜欢科研,但是科研压力很大,想出好文章有时违背本心。而且鼠鼠方向和工业界联系不紧密,挣不了大钱。如果出国的话,🇺🇸现在环境比较糟糕,签证很难弄。好几个朋友想出国申博,还没结果。祝他们好运吧,我就不想继续卷了。同学院其他找工作的女生同学,只能找营销,产品经理之类的岗位,她们不是很喜欢。我是本科有一些开发经历,加上学历过关,才能转码的。男生稍微好一点,但是专业原因找工作也是有一些困难。大概就记录到这里吧,供大家参考,尤其是和我一样不上不下背景,正在纠结的朋友。截图随便配的,这家公司投了之后懒得做测评,今天收到面试邀请,我懒得去了。位置在惠州,觉得很远。u1s1,开发的工作真的好多,不论老家,还是惠州这种城市,还是深圳,都很多。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务