上海月赛2020年4月

丙组T1:https://www.iai.sh.cn/problem/24

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

int main()
{
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    int cnt = 0;
    if(a >= 90) cnt++;
    if(b >= 90) cnt++;
    if(c >= 90) cnt++;
    if(cnt >= 2 && d >= 85) cout << "Qualified";
    else cout << "Not qualified";

    return 0;
}

丙组T2:https://www.iai.sh.cn/problem/42

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

int n, m;
char c[105][105];

int dx[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
int dy[8] = {-1, -1, -1, 0, 1, 1, 1, 0};

//判断每一个格子,是否改变状态,如果改变状态则不稳定
int main()
{
    bool yes = true;
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> c[i][j];
    
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            int live = 0; //周围8个存活的个数
            int die = 0; //周围8个死亡的个数
            for(int k = 0; k < 8; k++)
            {
                int nx = i + dx[k];
                int ny = j + dy[k];
                if(nx < 1 || nx > n || ny < 1 || ny > m) continue;
                if(c[nx][ny] == '*') live++;
                if(c[nx][ny] == '.') die++;
            }
            //下面两种情况会导致不稳定情况
            if(c[i][j] == '*' && (live < 2 || live > 3)) yes = false;
            if(c[i][j] == '.' && live == 3) yes = false;
        }
    }
    if(yes) cout << "Still life";
    else cout << "Other";

    return 0; 
}

丙组T3:https://www.iai.sh.cn/problem/33

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

int n;
int a[100005];
long long ans;

//本题是要把每个城市的数字变成0
//所有无论是正数,还是负数,都需要变成0
//从头开始,对每一个城市的数字,将其变成0(工作量是当前数字的绝对值),只从后面一个城市的数字搬,
//后面一个城市的数字变成加上前一个城市的数字,直到最后
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];

    for(int i = 1; i < n; i++)
    {
        ans += abs(a[i]);
        a[i + 1] += a[i];
    }

    cout << ans;

    return 0;
}

丙组T4:https://www.iai.sh.cn/problem/26

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

int main()
{
    string s;
    cin >> s;
    int p = -1; //符号的位置
    int n = 0; //数字的个数
    int dn = 0; //小数点的个数
    int xn = 0; //非法字符的个数

    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] == '+' || s[i] == '-')
        {
            p = i;
        }
        else if(s[i] == '.')
        {
            dn++;
        }
        else if(s[i] >= '0' && s[i] <= '9')
        {
            n++;
        }
        else xn++;
    }
    bool yes = true;
    //必须有数字,整数和小数部分不能都省略
    if(n == 0) yes = false;

    //正负号必须在第一个
    if(p > 0) yes = false;

    //小数点只能有一个
    if(dn > 1) yes = false;

    //不能有非法字符
    if(xn > 0) yes = false;

    if(yes) cout << "Valid";
    else cout << "Invalid";

    return 0;
}

丙组T5:https://www.iai.sh.cn/problem/30

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

int n, ans;
int a[1000005];

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + n + 1);
    //双指针算法
    //i枚举天,j枚举苹果
    //先跳过过期的苹果,再吃一个苹果
    for(int i = 1, j = 1; j <= n;i++) //i枚举天,j表示第几个苹果
    {
        while(j <= n && a[j] + 1 < i) j++; //跳过过期的
        if(j <= n) ans++, j++; //吃一个
    }
    cout << ans;
    return 0;
}

 

posted @ 2024-07-11 11:30  五月江城  阅读(14)  评论(0编辑  收藏  举报