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

浙公网安备 33010602011771号