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 ++