题目链接

L1-1 谢谢卡尔!

签到题

#include<bits/stdc++.h>

using namespace std;

int main() {
    cout << "谢谢卡尔!\\(>_<)/";
    return 0;
}

L1-2 现在是,幻想时间!

签到题

#include<iostream>
#include<cstdio>

using namespace std;

int main() {
    double n,m;
    cin>>n>>m;
    printf("%.3f",n/m);
    return 0;
}

L1-3 你是来陪可莉炸鱼的吗?

签到题

#include<iostream>

using namespace std;

int a[1010];

int main() {
    int  n;
    cin>>n;
    int sum=0;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        if(x<100)sum++;
        if(x>=100&&x<200)sum+=2;
        if(x>=200&&x<300)sum+=5;
        if(x>=300&&x<400)sum+=10;
        if(x>=400)sum+=15;
    }    
    cout<<sum<<endl;
    return 0;
}

L1-4 扫雷游戏

按照题目的意思对于每一个点遍历周围八个方向,统计一下有没有雷就可以了。

#include<bits/stdc++.h>

using namespace std;

const int N = 20;

char g[N][N];
int baup[N][N];
int n,m;
int dx[]{0,-1,0,1,-1,1,-1,1};
int dy[]{1,0,-1,0,1,1,-1,-1};

void bfs() {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            int ans = 0;
            if (g[i][j] == '*') {
                baup[i][j] = -1;
                continue;
            }
            for (int k = 0; k < 8; k++) {
                int x = i + dx[k], y = j + dy[k];
                if(x<1||x>n||y<1||y>m)continue;
                if (g[x][y] == '*')ans++;
            }
            if(ans==0)baup[i][j]=-2;
            else baup[i][j]=ans;
        }
    }
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> g[i][j];
        }
    }
    bfs();
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (baup[i][j] == -1)cout << '*';
            else if(baup[i][j]==-2)cout<<'.';
            else cout << baup[i][j];
        }
        cout << endl;
    }
    return 0;
}

L1-5 史莱姆

就简单遍历一遍字符串,如果遇到后一个字符与这个字符相等就将这个变为特定字符,不相等就让cnt++,但记得最后一个字符要特判,然后在输出的时候判断是否输出即可。

#include<bits/stdc++.h>

using namespace std;

int main() {
    int n;
    string s;
    cin >> n >> s;
    int cnt = 0;
    for (int i = 0; i < s.size(); i++) {
        if (i == s.size() - 1) {
            cnt++;
            break;
        }
        if (s[i] == s[i + 1])s[i] = '0';
        else cnt++;
    }
    cout << cnt << endl;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] != '0')cout << s[i];
    }
    return 0;
}

也可以使用队列来存。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;

int n;
string s;

int main() {
    cin >> n >> s;
    queue<char> q;
    for (int i = 0; i < s.size(); i++) {
        if (!q.size() || q.back() != s[i])q.push(s[i]);
    }
    cout << q.size() << endl;
    while (q.size()) {
        cout << q.front();
        q.pop();
    }
    return 0;
}

L1-6 加密通信

这个题就是每个字母会映射一个数值,而且k的值可能会比n的值大,所以需要取模,不然会有两个得分点没有。

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int n,m;
char s[10010];
int a[30];

int main() {
    cin >> n >> m >> s + 1;
    for (int i = 0; i < 26; i++)cin >> a[i];
    int k = m % n;
    for (int i = n-k+1; i <= n; i++)cout << a[s[i] - 'a'];
    for (int i = 1; i <n-k+1 ; i++)cout << a[s[i] - 'a'];
    return 0;
}

L1-7 字符操作

不要每次都使用substr这个函数,他的时间复杂度是由自穿的长度所决定的,如果字符串的长的达到了2e5,取一半就是1e5,每次都是1e5,所以有些数据点会超时,我们可以用两个标记来代表两个字串,每次交换两个的数值即可,二交换字符就判断在哪一个区间就可以了。

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int  N =100010;

int n, k;
string s, sa, sb;


int main() {
    cin >> n >> s >> k;
    sa = s.substr(0, n);
    sb = s.substr(n, n);
    char A = 'a', B = 'b';   //两个字符串的标志,1表示前n字符,2 表示后n个字符
    while (k--) {
        int t, a, b;
        cin >> t >> a >> b;
        if (t == 1) {
            if (A == 'a') {
                if (a - 1 < n && b - 1 < n)swap(sa[a - 1], sa[b - 1]);
                else if (a - 1 >= n && b - 1 >= n) swap(sb[a - n - 1], sb[b - n - 1]);
                else if (a - 1 < n && b - 1 >= n) swap(sa[a - 1], sb[b - n - 1]);
                else if (a - 1 >= n && b - 1 < n) swap(sb[a - n - 1], sa[b - 1]);
            } else {
                if (a - 1 < n && b - 1 < n)swap(sb[a - 1], sb[b - 1]);
                else if (a - 1 >= n && b - 1 >= n) swap(sa[a - n - 1], sa[b - n - 1]);
                else if (a - 1 < n && b - 1 >= n) swap(sb[a - 1], sa[b - n - 1]);
                else if (a - 1 >= n && b - 1 < n) swap(sa[a - n - 1], sb[b - 1]);
            }
        } else swap(A, B);
    }
    if (A == 'a')cout << sa << sb << endl;
    else cout << sb << sa << endl;
    return 0;
}

L2-1 游戏圈

就是简单的一个并查集的问题

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1000010;

int fa[N];
int n, m, q;

int find(int x){
    if(fa[x]!=x)fa[x]=find(fa[x]);
    return fa[x];
}

int main() {
    cin >> n >> m >> q;
    for (int i = 1; i <= n; i++)fa[i] = i;
    int cnt = n;
    while (m--) {
        int a, b;
        cin >> a >> b;
        a = find(a), b = find(b);
        fa[b]=a;
        cnt--;
    }
    //for(int i=1;i<=n;i++)cout<<fa[i]<<' ';
    while (q--) {
        int a, b;
        cin >> a >> b;
        if (find(a) != find(b))puts("no");
        else puts("yes");
    }
    cout << cnt << endl;
    return 0;
}

也可以使用bfs来做,因为数据范围小

L2-3 简单的数数