规定时间内只写完两道还有一道tle,不过也算是第一次独立完整写完周赛三道题,蛮开心的,记录一下
实在太土法代码了不敢发题解hhhhhhhh
4302.元素分类
https://www.acwing.com/problem/content/4305
题干略去
可以有某个类的数量为零,a类和-b类和,也就是负数扔到另一边求和,即求所有数绝对值的和即可
#include <cstdio>
using namespace std;
int main() {
int n;
int tmp,sum=0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &tmp);
sum += tmp < 0 ? -tmp : tmp;
}
printf("%d", sum);
return 0;
}
4303.链表
https://www.acwing.com/problem/content/4306/
打了个链表的幌子,也不像真链表,不会map,手写了个假的链表,存个头存个尾存个长度糊过去了
#include <iostream>
#include <vector>
using namespace std;
typedef struct {
string head, tail;
int length = 1;
} chain;
int main() {
// iostream加速
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
vector<chain> ls; //存放链表用的vector容器
chain tmp;// 临时
int n;
cin >> n;
while (n--) {
cin >> tmp.head >> tmp.tail;
tmp.length = 1;
if (!ls.size()) {
ls.push_back(tmp);
continue;
}
bool find = false;
for (int i = 0; i < ls.size(); i++) {
if (tmp.tail == ls[i].head) {
find = true;
ls[i].length++;
ls[i].head = tmp.head;
break;
}
if (tmp.head == ls[i].tail) {
find = true;
ls[i].length++;
ls[i].tail = tmp.tail;
break;
}
}
if (!find)
ls.push_back(tmp);
}
cout << ls.size() << endl;
if (ls.size())
for (auto ci : ls)
cout << ci.head << ' ' << ci.tail << endl;
return 0;
}
4304.字符串归类
https://www.acwing.com/problem/content/4307/
超级笨蛋做法,基本是暴力
把每个集合和单词保存成26位bool数组+一个可用标志(删除更麻烦还不如这样糊过去,一个结构体只有27个bool变量不担心mle)
并且把读入的单词和类都当作“是否存在字母a/b/c/…”的一个26位bool
每次for一遍26位看有没有重的,有重复的就合并(把来源的可用标志设成否,合并结果保存到目标对象
然后计数
和dalao们的简短代码形成鲜明对比
需要加注释的话评论区喊一嗓子就行
不说了回去看算法基础了
/*
[//]: # (打卡模板,上面预览按钮可以展示预览效果 ^^)
笨蛋做法
把每个集合和单词保存成26位bool数组+一个可用标志
每次for一遍26位看有没有重的
有重复的就合并(把来源的可用标志设成否,合并结果保存到目标对象
然后计数
和dalao们的简短代码形成鲜明对比
不说了回去看算法基础了
*/
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
#include <cstdio>
#include <vector>
using namespace std;
typedef struct {
bool chr[26] = {0};
bool available = 1;
} cls; // class类是关键字,英语笨蛋用cls顶替一下
cls get_word() {
char strin[60];
cls clsi;
clsi.available = true;
scanf("%s", strin);
for (int i = 0; strin[i]; i++) {
if (strin[i] >= 'a' && strin[i] <= 'z' && !clsi.chr[strin[i] - 'a'])
clsi.chr[strin[i] - 'a'] = true;
}
return clsi;
}
bool is_same_cls(cls& wordi, cls& classi) {
for (int i = 0; i < 26; i++)
if (wordi.chr[i] && classi.chr[i])
return 1;
return 0;
}
void merge_cls(cls& source, cls& target) {
source.available = false;
for (int i = 0; i < 26; i++)
target.chr[i] = source.chr[i] || target.chr[i];
}
int main() {
int n;
scanf("%d", &n);
if (n <= 0) {
printf("%d", n);
return 0;
}
vector<cls> mcls;
n--;
cls tmp = get_word();
mcls.push_back(tmp);
int c = 1;
while (n--) {
tmp = get_word();
bool found = false;
int posi = -1;
for (int i = 0; i < mcls.size(); i++) {
if (!mcls[i].available)
continue;
if (is_same_cls(tmp, mcls[i])) {
if (found) {
merge_cls(mcls[i], mcls[posi]);
c--;
} else {
found = true;
merge_cls(tmp, mcls[i]);
posi = i;
}
}
}
if (!found) {
mcls.push_back(tmp);
c++;
}
}
printf("%d", c);
return 0;
}