把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解 P6548 [COCI2010-2011#2] IGRA

传送门

题意

\(A\)\(B\) 两个人,有一个含 \(n\) 个字符的字符串。\(A\) 始终取最右侧的字符,\(B\) 可以取任意一个字符,问 \(B\) 所取的字符串能否胜过 \(A\),以及 \(B\) 能取的最大字符串。

分析

首先,我们 \(A\) 肯定会选择当前的最小的字符,我们就可以先把字符按大小排序,字符相同的按下标从大到小排序,将 \(B\) 每次取的的标记,跳过这些节点即可。

#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int N = 1e5+5;
int n, m,pos[N];
char s[N],c[N];
bool vis[N];
struct node {
	char num;
	int id;
	friend bool operator < (node fi,node se) {
		return fi.num==se.num? fi.id>se.id :fi.num<se.num;
	}
} b[N];
char ans[N];
signed main() {
	cin>>n>>s+1;
	for(int i=1; i<=n; ++i) b[i]=<%s[i],i%>;
	sort(b+1,b+n+1);
	for(int i=1; i<=n; ++i) pos[b[i].id]=i;
	int R=n,flag=1,now=1;
	for(int i=1; i<=n/2; ++i) {
		while(R&&vis[pos[R]]) --R;
		vis[pos[R]]=1;
		while(vis[now]) ++now;
		vis[now]=1;
		ans[i]=b[now].num;
		if(flag==1&&s[R]>b[now].num) flag=0;
		else if(flag==1&&s[R]<b[now].num) flag=2;
	}
	if(flag) cout<<"NE\n";
	else cout<<"DA\n";
	for(int i=1;i<=n/2;++i) cout<<ans[i];
	return 0;
}
posted @ 2024-01-30 15:58  djh0314  阅读(36)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end