2 条题解

  • 5
    @ 2024-10-5 14:17:35

    首先,用贪心的方式,哪边大/小删哪个是不可取的,因为存在可以 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
    @ 2024-10-5 16:11:59

    雷迪森安德镇特们,你们嚎! 别紫菜我😕 (蒟蒻恐惧)

    正经的来了

    思路: 首先,雪的教训,应该没人看见万万不可那边小删哪个,不行看这个 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
上传者