上海月賽2020年4月

五月江城發表於2024-07-11

丙組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;
}

相關文章