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