其他分享
首页 > 其他分享> > SZUACM2022招新积分赛Day1 总结

SZUACM2022招新积分赛Day1 总结

作者:互联网

SZUACM2022招新积分赛 Day1

题目

下午场:

晚上场:

感想

下午场的状态实在差到离谱。。而且我图论完全乱来的emmm练得太少了(深刻忏悔)
感觉下午场难好多,搞得我非常的自闭。。。
晚上感觉还好一点,唉。。我好菜
下午场就基本是思路都没有,晚上场还可以说是有些差一点(漏情况)(虽说也很不应该。。。

补题

下午场

没做出来的有点多,明天上午再看看。。

A. Gym 103687A

考虑奇偶性,步数的判断。我出错的点就在于,没想到答案不会超过3,一步一步凑的。。。好笨
具体的看注释后面的样例

#include <bits/stdc++.h>

using namespace std;


int main () {
    int t;
    cin >> t;
    while (t --) {
        int a, b;
        cin >> a >> b;
        if (a > b) {
            if ((a - b) % 2 == 0)
                cout << 1 << endl;
            else
                cout << 2 << endl;
        }
        else if (a == b)
            cout << 0 << endl;
        else {
            if ((b - a) % 2)
                cout << 1 << endl;
            else if ((b - a) / 2 % 2)
                cout << 2 << endl;
            else
                cout << 3 << endl;
        }
    }
}
//改变奇偶性
//eg.2->6: +3 +3 -2
//答案不会超过3

晚上场

B. Gym 103107K

我贪错心了,直接想假了emmm
其实直接全部拼在一起就好

#include <bits/stdc++.h>
#define int long long

using namespace std;
//priority_queue <int, vector <int>, greater <int>> q;
priority_queue <int> q;
int ans = 0;
int a, b;
int maxn= 0;

signed main () {
    int n, k;
    cin >> n >> k;
    while (n --) {
        int x;
        cin >> x;
        ans += x;
    }

    if (ans >= k)
        cout << ans - (k + 1) / 2; //ceil
    else
        cout << 0;
}

//害,想假了

C. Gym 103107J

错因:一对一匹配,所以最终B没有的话也不行(因B的匹配也要看)
双向考虑

#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> pii;
const int N = 5e5 + 5;
int a[N], b[N];
int ans1, ans2;

int main () {
    int n, m;
    scanf("%d%d",&n,&m);
    ans1 = ans2 = n;
    
    while (m --) {
        int x, y;
        scanf("%d%d",&x,&y);
        a[x] ++, b[y] ++; //一对一匹配,所以也要考虑b啊
        if (a[x] >= n)
            ans1 --;
        if (b[y] >= n)
            ans2 --;
    }

    cout << min (ans1, ans2);
}
//有多少个A可以正常跑的
//A与所有的B都不能跑

//配对
//一一匹配所以B也要考虑
//卡读写的题就是纯纯的。。。

D.CodeForces 1628B

差一点就能写出div1B了(少讨论了前3后2的情况)
(话说我其实想到了,但是没写上去,不知道为啥,晕了)
Way1:在set里面找,似乎要慢一点

#include <bits/stdc++.h>


using namespace std;
const int N = 1e5 + 5;

void solve () {

    set<string> s;
    int n;
    cin >> n;
    bool flag = false;
    for (int i = 1; i <= n; i  ++)  {
        string t;
        cin >> t;
        if (flag)
            continue;

        if (t[0] == t[t.size() - 1]) {
            flag = true;
            continue;
        } //自身回文

        s.insert (t);

        int len = t.size (); 
        reverse (t.begin(), t.end());

        if (s.count (t)) {
            flag = true;
            continue;
        }

        //ab   cba
        //t="abc"

        //现3,匹配2
        if (len == 3) {
            string tt;
            for (int i = 0; i < 2; i ++)
                tt += t[i];
            //cout << tt << endl;
            if (s.count (tt)) {
                flag = true;
                continue;
            }
        }

        //现2,匹配3
        else if (len == 2) {
            for (auto j : s) {
                if (t[0] == j[0] && t[1] == j[1]) {
                    flag = true;
                    break;
                }
            }
        }
        
    }

    if (flag)
        cout << "YES" << endl;
    else
        cout << "NO"  << endl;
    
}

int main () {
    int t;
    cin >> t;
    while (t --) {
        solve ();
    }
    
}
//去掉某几个后能否变得回文

//如果找到两个完全相反的一定yes
//出现单个回文yes
//中间多出来一个也yes(case4)


//eg
//ab (cc) ba
//NO
//NO
//a
//ab cba
//NO

Way2:直接枚举26种拼接(与方法一就只有前3后2的判别上有区别)
比第一种快一些(但是大佬觉得太暴力了,打灭x)

//加字母拼起来,更快
#include <bits/stdc++.h>


using namespace std;
const int N = 1e5 + 5;

void solve () {

    set<string> s;
    int n;
    cin >> n;
    bool flag = false;
    for (int i = 1; i <= n; i  ++)  {
        string t;
        cin >> t;
        if (flag)
            continue;

        if (t[0] == t[t.size() - 1]) {
            flag = true;
            continue;
        } //自身回文

        s.insert (t);

        int len = t.size (); 
        reverse (t.begin(), t.end());

        if (s.count (t)) {
            flag = true;
            continue;
        }

        //ab   cba
        //t="abc"

        //现3,匹配2
        if (len == 3) {
            string tt;
            for (int i = 0; i < 2; i ++)
                tt += t[i];
            //cout << tt << endl;
            if (s.count (tt)) {
                flag = true;
                continue;
            }
        }

        //现2,匹配3
        else if (len == 2) {
            //更快的做法
            for (char ch = 'a'; ch <= 'z'; ch ++) {
                string tmp = t + ch;
                if (s.count (tmp)) {
                    flag = true;
                    break;
                }
            }
            // for (auto j : s) {
            //     if (t[0] == j[0] && t[1] == j[1]) {
            //         flag = true;
            //         break;
            //     }
            // }
        }
        
    }

    if (flag)
        cout << "YES" << endl;
    else
        cout << "NO"  << endl;
    
}

int main () {
    int t;
    cin >> t;
    while (t --) {
        solve ();
    }
    
}
//去掉某几个后能否变得回文

//如果找到两个完全相反的一定yes
//出现单个回文yes
//中间多出来一个也yes(case4)


//eg
//ab (cc) ba
//NO
//NO
//a
//ab cba
//NO

F. CodeForces 664A

没想到防ak的题目才是真正的签到题(真是极具迷惑性)
直接赌徒心态

#include <bits/stdc++.h>

using namespace std;

int main () {
    string s, t;
    cin >> s >> t;
    if (s == t)
        cout << s;
    else {
        cout << 1;
    }
}
//赌

其余的题目明早补。
希望明天我能给力点啊QAQwwwww

标签:招新,cout,int,cin,Day1,SZUACM2022,flag,--,include
来源: https://www.cnblogs.com/CTing/p/16296683.html