1. 程式人生 > 其它 >CF401B - Sereja and Contests

CF401B - Sereja and Contests

Problem

CF有一些比賽,有的比賽只有Div2,其它的既有Div1也有Div2。每個比賽有個識別符號,從 \(1\) 開始依次編號,如果一場比賽有Div1和Div2,則Div2的識別符號一定是這次比賽的Div1的識別符號 \(+1\) 。已知一個人在 \([1,n)\) 的時間段內共打了 \(k\) 次比賽,知道每次比賽是否分Div以及它的識別符號。問這個人最多可能錯過多少Div2比賽,最少錯過多少場。

Solution

給所有出現了的編號打一個標記。對於剩下沒有標記的編號,最大值肯定就是這些編號的總數量。對於一段連續的無標記編號,會發現div2場的最少數量是這一段連續的編號數量除以 \(2\)

向上取整,模擬即可。

#include<bits/stdc++.h>
using namespace std;
bool f[4010];
int main()
{
	int n,m,i,j,l=0,r=0;
	scanf("%d %d",&n,&m);
	f[n]=true;
	for(i=1;i<=m;i++)
	{
		int op,n1,n2;
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d %d",&n1,&n2);
			f[n1]=f[n2]=true;
		}
		else
		{
			scanf("%d",&n1);
			f[n1]=true;
		}
	}
	int cmb=0;
	for(i=1;i<=n;i++)
	{
		if(!f[i]) cmb++;
		else
		{
			l+=cmb/2+(cmb%2);
			r+=cmb;
			cmb=0;
		}
	}
	printf("%d %d",l,r);
	return 0;
}