南昌理工acm大一选拔赛(H、G)题解

F题

/*
二分答案
直接l, r拟定答案区间,在拟定答案进行测试,根据单调性,取k最小值。
*/

string s;
bool check(int m)
{
	map<char, int> mp;
	map<char, int> mpp;
	for (int i = 0; i < m; i ++) mp[s[i]] ++;
	for (char j = 'a'; j <= 'z'; j ++)
	{
		if (mp[j] > 0) mpp[j] ++;
	}
	for (int i = m; i < s.size(); i ++)
	{
		mp[s[i]] ++;
		mp[s[i - m]] --;
		for (char j = 'a'; j <= 'z'; j ++)
		{
			if (mp[j] > 0) mpp[j] ++;
		}
	}
	for (auto t : mpp)
	{
		if (t.second == s.size() - m + 1) return false;
	}
	return true;
}

void solve()
{
    
    cin >> s;
    int l = 1, r = s.size();
    while (l < r)
    {
    	int mid = l + r >> 1;
    	if (check(mid)) l = mid + 1;
    	else r = mid;
    }
    cout << l << '\n';
}

G题

/*
注意x和k的范围,这个答案输出符合条件的x即可。
k可以为0, x的取值范围(1~1e9)
*/

int a[N];
void solve()
{
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    sort(a + 1, a + n + 1);
    if (a[k + 1] == a[k]) cout << -1 << '\n';
    else if (k == 0 && a[1] == 1) cout << -1 << '\n';
    else cout << max(a[k], 1) << '\n';
}
posted @ 2023-04-20 21:01  N再再  阅读(88)  评论(0)    收藏  举报