2020.10.03天梯赛补题报告
7-9 排座位
https://pintia.cn/problem-sets/1311653744057376768/problems/1311836431267258368
思路:数据较小,可直接用邻接矩阵来存储图结构。如果两人使朋友,就输出NO problem, 不是朋友但也不是敌人,则输出OK, 是敌人但有共同朋友,则输出OK but..., 只有敌人关系,则输出no way;
下附代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 10010;
int g[110][110];
int main()
{
int n, m, k;
cin >> n >> m >> k;
for(int i = 0;i < m; ++ i){
int x, y, state;
cin >> x >> y >> state;
g[x][y] = state;
g[y][x] = state;
}
for(int i = 0;i < k ; ++ i){
int x, y, flag = 0;
cin >> x >> y;
if(g[x][y] == -1){
for(int j = 1;j <= n; ++ j){
if(g[x][j] == 1&& g[x][j] == 1){
flag = 1;
cout << "OK but...\n";
break;
}
}
if(!flag)
cout << "No way\n";
}
if(g[x][y] == 1){
cout << "No problem\n";
}
if(g[x][y] == 0) {
cout << "OK\n";
}
}
}
7-11 重排链表 (25分)
https://pintia.cn/problem-sets/1311653744057376768/problems/1311836431267258370
思路:
用一个结构体存储链表节点信息,包括地址,数据,指向下一个的地址,然后用一个数组将连边从头节点到尾节点串起来,最后依照题目输出...
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
struct node{
int pos, data, next;
}a[N];
vector<node> k;
int main()
{
int s, n;
scanf("%d %d", &s, &n);
for(int i = 1;i <= n; ++ i){
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
a[x].pos = x;
a[x].data = y;
a[x].next = z;
}
while(1){
k.push_back(a[s]);
if(a[s].next == -1) break;
s = a[s].next;
}
// for(int i = 0;i < k.size(); ++ i){
// printf("%05d ", k[i].pos);
// }
int q1 = 0, q2 = k.size() - 1;
// puts("");
while(q1 <= q2){
if(q1 == q2){
printf("%05d %d -1", k[q1].pos, k[q1].data, k[q2].pos);
break;
}
printf("%05d %d %05d\n", k[q2].pos, k[q2].data, k[q1].pos);
if(q1 == q2 - 1)
printf("%05d %d -1", k[q1].pos, k[q1].data, k[q2].pos);
else
printf("%05d %d %05d\n", k[q1].pos, k[q1].data, k[q2-1].pos);
q1 ++;
q2 --;
}
}
7-12 分而治之 (25分)
https://pintia.cn/problem-sets/1311653744057376768/problems/1311836431267258371
题目大意:
给出n个点和m条边,问拿掉几个点这个图还有无连通的地方,若该图任意两点之间都无边,则输出YES, 否则输出NO。
思路:
用两个数组存储连通的边,用另一个数组表示该节点是否存在;当删除该节点时,该节点消失;经过一番操作,删掉几个节点,然后再用前两个数组判断还有无连通的边...
#include <bits/stdc++.h> using namespace std; const int N = 10010; int a[N], b[N], c[N], v, n; int main() { cin >> v >> n; for(int i = 1;i <= n; ++ i){ cin >> a[i] >> b[i]; } int q, k; cin >> q; while(q --){ memset(c, 0, sizeof(c) ); cin >> k; for(int i = 0;i < k; ++ i){ int x; cin >> x; c[x] = 1; } bool flag = true; for(int i = 1;i <= n; ++ i){ if(c[a[i]] == 0 && c[b[i]] == 0){ flag = false; break; } } if(flag) puts("YES"); else puts("NO"); } }

浙公网安备 33010602011771号