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");
    }
}

 

 

posted @ 2020-10-07 14:58  IIlIlIlI  阅读(95)  评论(0编辑  收藏  举报