列表

详情


NC24044. [USACO 2015 Dec S]High Card Wins

描述

Bessie the cow is a huge fan of card games, which is quite surprising, given her lack of opposable thumbs. Unfortunately, none of the other cows in the herd are good opponents. They are so bad, in fact, that they always play in a completely predictable fashion! Nonetheless, it can still be a challenge for Bessie to figure out how to win.

Bessie and her friend Elsie are currently playing a simple card game where they take a deck of 2N2N cards, conveniently numbered 1…2N1…2N, and divide them into NN cards for Bessie and NN cards for Elsie. The two then play NN rounds, where in each round Bessie and Elsie both play a single card, and the player with the highest card earns a point.

Given that Bessie can predict the order in which Elsie will play her cards, please determine the maximum number of points Bessie can win.

输入描述

The first line of input contains the value of N (1≤N≤50,0001≤N≤50,000).

The next N lines contain the cards that Elsie will play in each of the successive rounds of the game. Note that it is easy to determine Bessie's cards from this information.

输出描述

Output a single line giving the maximum number of points Bessie can score.

示例1

输入:

3
1
6
4

输出:

2

说明:

Here, Bessie must have cards 2, 3, and 5 in her hand, and she can use these to win at most 2 points by saving the 5 until the end to beat Elsie's 4.

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 14ms, 内存消耗: 612K, 提交时间: 2019-08-09 16:17:49

#include<iostream>
#include<cstdio>
 
using namespace std;
 
int n;
bool f[100010];
int ans=0;
 
int main(){
	scanf("%d",&n);
	for(int i=0; i<n; i++){
		int x;
		scanf("%d",&x);
		f[x]=true;
	}
	int num=0;
	for(int i=1; i<=2*n; i++){
		if(f[i])num++;
		if(!f[i] && num)num--,ans++;
	}
	printf("%d\n",ans);
	
	return 0;
}

C++(clang++11) 解法, 执行用时: 13ms, 内存消耗: 760K, 提交时间: 2020-12-07 10:41:44

#include<iostream>
using namespace std;
int n,z;
int vis[100007];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&z);
		vis[z]=1;
	}
	int cnt=0,ans=0;
	for(int i=1;i<=2*n;i++){
		if(vis[i]==1){
			cnt++;
		}
		else{
			if(cnt>0){
				cnt--;
				ans++;
			}
		}
	}
	printf("%d\n",ans);
}

上一题