NEUQ-2021寒假训练-二分和尺取法

A - Kefa and Company

#include<bits/stdc++.h>
#define int long long
using namespace std;

struct node 
{
	int mon;
	int fri;
};

bool cmp(node x, node y) 
{
	return x.mon < y.mon;
}

const int maxn = 1e5 + 5;
node a[maxn];
int b[maxn];
int sum[maxn];

signed main() 
{
	int n, d;
	cin >> n >> d;

	for(int i = 0; i < n; i ++) 
	{
		cin >> a[i].mon >> a[i].fri;
	}

	sort(a, a + n, cmp);

	for(int i = 1; i <= n; i ++) 
	{
		b[i - 1] = a[i - 1].mon;
		sum[i] = sum[i - 1] + a[i - 1].fri;
	}

	int ans = 0;
	for(int i = 0; i < n; i ++) 
	{
		int it = upper_bound(b, b + n, a[i].mon + d - 1) - b;
		ans = max(ans, sum[it] - sum[i]);
	}
	cout << ans;
	
	return 0;
}

B - More Cowbell

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int maxn = 100000 + 5;
int a[maxn], b[maxn];

signed main() 
{
	int n, k;
	cin >> n >> k;
	
	for (int i = 1; i <= n; i ++)
	{
		cin >> a[i];
	}
	
	for (int i = n - k, j = n - k + 1; i >= 1; i --, j ++)
	{
		a[i] += a[j];
	}
	
	sort(a + 1, a + 1 + n);
	
	cout << a[n];
	
	return 0;
}

C - Alternative Thinking

#include <iostream>
using namespace std;
int main() 
{
	int n;
	cin >> n;
	
	string s;
	cin >> s;
	
	int cnt = 1;
	char ch = s[0];
	
	for(int i = 1; i < n; i ++) 
	{
		if (s[i] != ch)
		{
			ch = s[i];
			cnt ++;
		}
	}
	
	cout << min(n, cnt + 2);
	
	return 0;
}

D - Drying

#include<iostream>
#define int long long
using namespace std;

const int maxn = 100000 + 5;
int a[maxn];

signed main()
{	
    int n;
    while(cin >> n)
    {
        int most = 0;
        
        for(int i = 0; i < n; i ++)
        {
            scanf("%lld", &a[i]);
            most = max(most, a[i]);
        }
        
        int k;
        cin >> k;
        
        if(k == 1)
        {
            cout << most << endl;
            continue;
        }
        
        int l = 0, r = most;
        
        while(l != r)
        {
            int mid = (r + l) / 2;
            int t = 0;
            for(int i = 0; i < n; i ++)
            {
                if(a[i] > mid)
                {
                    t += (a[i] - mid) / (k - 1);
                    if((a[i] - mid) % (k - 1))
                    {
                    	t ++;
					}    
                }
            }
            if(t <= mid)
            {
            	r = mid;
			}
            else
            {
            	l = mid + 1;
			}      
        }
        cout << l << endl;
    }
    
    return 0;
}

E - The Frog’s Games

#include <iostream>
#include <algorithm>
#define int long long
using namespace std;

const int maxn = 500000 + 5;
int a[maxn];
int l, n, m;

bool check(int ans)
{
	int vis = 0;
	for (int i = 1; i <= m; i ++)
	{
		vis = upper_bound(a, a + n, a[vis] + ans) - a - 1;
		if (vis >= n - 1) return 1;
	}
	return 0;
}

signed main()
{
	int lef, rig, mid;
	while (cin >> l >> n >> m)
	{
		a[0] = 0;
		for (int i = 1; i <= n; i ++)
		{
			scanf("%lld", &a[i]);
		}
		a[n + 1] = l;
		
		n += 2;
		sort(a, a + n);
		
		lef = l / m, rig = l; 
		while (lef <= rig)
		{
			int mid = lef + rig >> 1;
			if (check(mid)) rig = mid - 1;
			else lef = mid + 1;
		}
		
		printf("%lld\n", lef);
	}
	return 0;
}

F - Subsequence

#include <iostream>
#define int long long
using namespace std;

const int inf = 0x3f3f3f;
const int maxn = 100000 + 5;
int a[maxn];

signed main()
{
	int t;
	cin >> t;
	while (t --)
	{
		int n, s;
		scanf("%lld%lld", &n, &s);
		
		for (int i = 0; i < n; i ++)
		{
			scanf("%lld", &a[i]);
		}
		
		int ans = inf, sum = 0;
		
		for (int i = 0, j = 0; i < n; i ++)
		{
			while (sum < s && j < n)
			{
				sum += a[j ++];
			}
			if (sum >= s)
			{
				ans = min(ans, j - i);
			}
			sum -= a[i];
		}
		
		if (ans == inf) ans = 0;
		
		printf("%lld\n", ans);
	}
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值