补:A . D . E 黑龙江农垦科技职业学院喜迎寒假多校联赛2

A 数组截取

数据真滴强大,卡在90%过不了,甚至我去找了一些人的AC代码,现在也只能90%,喵喵喵?

  • 主要是 快读 和 双指针。
  • 至今仍然想不清楚为什么 90% 。
  • 刚刚看到有的大佬用前缀和优化,改天试试。
//自己写的 90 %
#include<bits/stdc++.h>
#define PI acos(-1)
#define endl "\n"
#define mm(a, b) memset(a, b, sizeof(a))
#define debug freopen("1.in", "r", stdin), freopen("1.out", "w", stdout);
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef pair<int , int> PII;
 
const int N = 2e7 + 1;
 
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
 
ll a[200000001];
ll n, k, sum,lft;
 
int main()
{
    n = read(),k = read();
    ll ans = -1;
    for(int i = 0;i < n;i ++)
    {
        a[i] = read();
        sum += a[i];
        //不加下面这个if,数据就只过 80 %
        if(sum < k)continue;
        while(sum > k)
        {
            sum -= a[lft];
            lft ++;
        }
        if(sum == k)
        {
            ans = max(ans , i - lft + 1);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

大佬AC代码:

#include<iostream>
using namespace std;
long long num[20000005];
long long read() {
    long long x = 0, w = 1;
    char ch = 0;
    while (ch < '0' || ch > '9') {
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + (ch - '0');
        ch = getchar();
    }
    return x;
}
inline void write(long long x) {
    static int sta[35];
    int top = 0;
    do {
        sta[top++] = x % 10, x /= 10;
    } while (x);
    while (top) putchar(sta[--top] + 48);
}
int main()
{
    long long n,k,sum=0,ans=-1,i=1,j=1;
    n=read();k=read();
    while(i<=n){
        while(sum<=k && i<=n){
            num[i]=read();
            sum+=num[i];
            if(sum==k){
                ans=(i-j+1)>ans?(i-j+1):ans;
            }
            i++;
        }
        while(sum>k && i>=j){
            sum-=num[j];
            j++;
        }
        if(sum==k){
            ans=(i-j)>ans?(i-j):ans;
        }
    }
    if(ans==-1) puts("-1");
    else write(ans);
    return 0;
}

D issue与lifehappy给学生分组

传送门

属于二分题目,最主要的是check函数。

#include<iostream>

using namespace std;

typedef unsigned long long ull;

const int N = 1e6 + 10;

int n,m;
ull a[N],l,r;

bool check(ull mid)
{
	ull sum = 0;
	ull cnt = 1;
	for(int i = 0;i < n;i ++)
	{
		sum += a[i];
		if(sum > mid)
		{
			sum = a[i];
			cnt ++;
		}
	}
	//cout << cnt << endl;
	if(m >= cnt)return true;
	return false;
}

int main()
{
	scanf("%d %d",&n,&m);
	for(int i = 0;i < n;i ++)
	{
		scanf("%llu",&a[i]);
		r += a[i];
	}
	//cout << check(6) << endl; 
	while(l < r)
	{
		ull mid = (l + r) >> 1;
		//mid >= m
		if(check(mid))r = mid;
		else l = mid + 1;
	    //cout << "l = " << l << " r = " << r << endl; 
    }
	printf("%llu",l);
}

E 删删删越小越好

单调栈,比赛的时候用了 stl 的string 但是不明原因不过,以后再补这个题 >(flag ++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值