2 条题解
-
5
首先,用贪心的方式,哪边大/小删哪个是不可取的,因为存在可以 hack 掉代码的数据,例如:
5 2 5 1 8 4 3 //预计输出 15 13 //实际输出 14 13
所以我们得使用其他方法
注意到,删去两边 = 留下中间,故我们可以用前缀和枚举中间剩下的部分的最大/最小值
#include<bits/stdc++.h> using namespace std; long long a[2000006],qian[200006],maxx=-1e18,minn=1e18,n,k; int main(){ //freopen("delete.in","r",stdin); //freopen("delete.out","w",stdout); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; qian[i]=qian[i]+a[i]; } for(int i=0;i<=k;i++){ maxx=max(maxx,qian[n-k+i]-qian[i]); minn=min(minn,qian[n-k+i]-qian[i]); } cout<<maxx<<" "<<minn; return 0; }
我给这份代码加了几个 bug,切忌 Ctrl+C/V
-
2
雷迪森安德镇特们,你们嚎! 别紫菜我😕 (蒟蒻恐惧)
正经的来了
思路: 首先,
雪的教训,应该没人看见万万不可那边小删哪个,不行看这个 TNND老孙居然只给这么点分。555。。所以应该怎么做呢
其实吧,这题允许模拟每种删法最后的结果,找最大的就行,
肥肠的原始具体思路在代码里。看好了,
劳资蒟蒻要上代码了😄#include<bits/stdc++.h> using namespace std; long long a[2000006],s[2000005],r=-1e18,l=1e18,n,k;//l、r必须开long long,不然爆掉 int main(){ freopen("delete.in","r",stdin); freopen("delete.out","w",stdout); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; s[i]=s[i-1]+a[i];//通过前缀和可以O(1)模拟 } for(int i=0;i<=k;i++){//挨个比较 r=max(r,s[n-k+i]-s[i]); l=min(l,s[n-k+i]-s[i]); } cout<<maxx<<" "<<minn; return 0; }
OK写完了。
好消息,好消息
这次的代码没有坑!所以点个 绿色的 赞再走吧,谢谢
- 1
信息
- ID
- 785
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 116
- 已通过
- 22
- 上传者