2019省赛补题

Game on a Graph

https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370511

题目大意。有两队人,一队是1,一队是2,两队混着站在一排。给一张n个点,m条边的图。那一排人可以一次拿走一条边,每次拿走都尽量不破坏这张图,就是说它还是张图,若轮到某人取出某条边,图恰好坏了,那么另一个队就赢了。输出赢的那个队。

思路:

  考察图的性质,n个点最多有n-1条边。所以我们可以确定第m - ( n - 1) 个人拿中第n-1条边,该队输。考虑到m - (n-1)  可能大于总人数, 所以结果应该对人数取模。

#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 10;
int t, k, n, m;
char team[N];

int main()
{
	scanf("%d", &t);
	while(t--){
		int s;
		scanf("%d%s%d%d",&s, team, &n, &m);
		for(int i = 1;i <= m; ++ i){
			int x, y;
			scanf("%d%d", &x, &y);
		}
		printf("%c\n", team[(m - n + 1)%s] == '1' ? '2' : '1');
	}
}

Tokens on the Segments 

https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370515

 这样贪心也能过 ...

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

struct node{
	int l, r;
};

bool cmp(node a, node b){
	if(a.l == b.l){
		return a.r < b.r;
	}
	return a.l < b.l;
}
node a[N];
map<int, bool> mp;
int t, n, cnt;
int main()
{
	scanf("%d", &t);
	while(t--){
		map<int, bool>::iterator it = mp.begin();
		
		for(;it!=mp.end();it++){
			it->second = false;
		}
		
		cnt = 0;
		scanf("%d", &n);
		for(int i = 1;i <= n; ++ i){
			scanf("%d%d", &a[i].l, &a[i].r);
		}
		
		sort(a + 1, a + 1 + n, cmp);
			
		for(int i = n; i >= 1; -- i){
			for(int j = a[i].r;j >= a[i].l; -- j){
				if(!mp[j]) {
					mp[j] = true;
					cnt ++;
					break;
				}
			}
		}
			
		printf("%d\n", cnt);
	}
}

  

posted @ 2020-10-01 15:38  IIlIlIlI  阅读(99)  评论(0编辑  收藏  举报