CF33C Wonderful Randomized Sum 题解
简要题意:
你可以无限次的把该数组的一个前缀和后缀 \(\times -1\),问最终的最大序列和。
这题盲目WA了数次才知道本质
这题89个数据吊打std
CF真好啊,发现一个错后面就不测了
下面,就以我艰辛的思维历程来构造本篇博客。
算法一
盲猜:所有数都可以变成正数。
然后绝对值相加。
连样例也没测。
然后,\(\frac{2}{89} pts\). 只过了前两个样例,第三个就死了。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int main(){
int n=read(),s=0; while(n--) {
int t=read();
s+=abs(t);
} printf("%d\n",s);
return 0;
}
算法二
突然发现不符合样例!
仔细想了以下,嗯嗯,似乎只有开始的前一段负数和最后的后一段负数可以改变。
然后若有所思的写下一段代码。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int n,a[N];
int s=0;
int main(){
n=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++)
if(a[i]<0) a[i]=-a[i];
else break; //前一段
for(int i=n;i>=1;i--)
if(a[i]<0) a[i]=-a[i];
else break; //后一段
for(int i=1;i<=n;i++) s+=a[i];
printf("%d\n",s);
return 0;
}
交上去,发现得了 \(\frac{6}{89}\) 分。
发现 \(a_i = 0\) 有点问题。
算法三
\(a_i = 0\)?然后加了几个等号。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int n,a[N];
int s=0;
int main(){
n=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++)
if(a[i]<=0) a[i]=-a[i];
else break;
for(int i=n;i>=1;i--)
if(a[i]<=0) a[i]=-a[i];
else break;
for(int i=1;i<=n;i++) s+=a[i];
printf("%d\n",s);
return 0;
}
然后得了 \(\frac{8}{89}\) 分。
我却,我答案是负数,它答案是正数
算法四
真正感到自己 脑抽了 挺坚强的。
其实呢,我们还是要重视它,毕竟是 \(C\) 吗。(其实也不难)
你想,比方说前一段是 \(A\),后一段是 \(C\),重叠是 \(B\),一共是 \(S\).(\(\emptyset = 0\))
(指前缀、后缀、重叠部分、总部分的和)
此时答案为:
\]
然而:
\]
(这是因为,中间一段经过两次之后没变,所以还是加上)
所以答案变形为:
\]
显然让 \(C\) 越大越好。
那答案不就摆在面前了?
Dev-c++:那你还调试那么多次
因为,\(C\) 肯定是连续的一段并且你可以随便的取,所以:
\]
哎呀,激动地写了个程序。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int n,a[N];
int s=0,f[N];
int main(){
n=read();
for(int i=1;i<=n;i++) a[i]=read(),s+=a[i];
int ans=a[1]; f[1]=a[1];
for(int i=2;i<=n;i++) f[i]=max(f[i-1]+a[i],a[i]),ans=max(ans,f[i]);
printf("%d\n",ans*2-s);
return 0;
}
看上去没啥问题,然后得了 \(0pt\).
原因: \(\texttt{ans}\) 的初值应该是:
max(a[1],0)
导致第一个样例去世,然后全军覆没~
算法五
终于算是拨云见雾了,结果在临近 \(\texttt{AC}\) 的时候因为初值掉坑。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int n,a[N];
int s=0,f[N];
int main(){
n=read();
for(int i=1;i<=n;i++) a[i]=read(),s+=a[i];
int ans=max(a[1],0); f[1]=a[1];
for(int i=2;i<=n;i++) f[i]=max(f[i-1]+a[i],a[i]),ans=max(ans,f[i]);
printf("%d\n",ans*2-s);
return 0;
}
终于 \(\text{AC}\) 了。时间复杂度:\(O(n)\).
CF33C Wonderful Randomized Sum 题解的更多相关文章
- 【极值问题】【CF33C】 Wonderful Randomized Sum
传送门 Description 给你一个数列\(A\),你可以选择任意一个前缀和任意一个后缀,前缀后缀可重合.给他们乘\(-1\).求最大能获得的序列和. Input 第一行是一个数\(n\)代表数列 ...
- Ural 1248 Sequence Sum 题解
目录 Ural 1248 Sequence Sum 题解 题意 题解 程序 Ural 1248 Sequence Sum 题解 题意 给定\(n\)个用科学计数法表示的实数\((10^{-100}\s ...
- LeetCode Continuous Subarray Sum 题解 同余前缀和 Hash表
文章目录 题意 思路 特殊情况k=0 Source Code 1 Source Code 2 题意 给定一个数组和一个整数k,返回是否存在一个长度至少为2的连续子数组的和为k的倍数. 思路 和上一篇博 ...
- Hdoj 1003.Max Sum 题解
Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...
- [LeetCode]Combination Sum题解(DFS)
Combination Sum Given a set of candidate numbers (C) (without duplicates) and a target number (T), f ...
- [LeetCode] Three Sum题解
Three Sum: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? ...
- 01Two Sum题解
Tow Sum 原题概述: Given an array of integers, return indices of the two numbers such that they add up to ...
- 【CF1445D】Divide and Sum 题解
题目链接 题意简介 将一个长度为 2n 的数列平均分为两个子数列 p 和 q 后,p 按从小到大排序,q 按从大到小排序. 排序后,记 p 为 \(\{x_i\}\) ,q 为 \(\{y_i\}\) ...
- BZOJ3155:Preprefix sum——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3155 最朴素的想法是两棵树状数组,一个记录前缀和,一个记录前缀前缀和,但是第二个我们非常不好修改 ...
随机推荐
- javascript中this的四种用法
javascript中this的四种用法 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2015-05-11我要评论 在javascript当中每一个function都是一个对象,所 ...
- http概述——http笔记一
之前想深入的了解学习下HTTP,所以就买了本砖头<HTTP权威指南>.最近一直在看,可是发现看书只有输入并没有输出,不行.所以就打算把自己的理解写成一系列的笔记,供以后翻阅. 大概画了张本 ...
- 用 Java 实现人脸识别功能(附源码)
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...
- electron+vue制作桌面应用--自定义标题栏
electron会默认显示边框和标题栏,如下图 我们来看一下如何自定义一个更加有(gao)意(da)思(shang)的标题栏,例如网易云音乐这种 首先我们要把默认的标题栏删掉,找到主进程中创建窗体部分 ...
- 微信小程序开发,如何优雅地兼容
小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容. 关于单个 API 如何兼容,微信官方提供了兼容文档,因此我们这里不再赘述.下面主要讨论在整个项目如 ...
- 如何理解js中的this和实际应用中需要避开哪些坑
this是什么 this就是函数内部的关键字 看下面例子理解js中的this // 例子1 function fnOne () { console.log(this) } 'use strict' f ...
- vue+element 表单封成组件(1)
作为一名刚接触vue不到一个月的菜鸟,思想还没有从操作DOM转变为数据驱动,看vue的代码处处别扭.组里为了让我熟悉vue交给了我一个将element 表单封装成组件的练手任务.由于开发过程中遇到的表 ...
- win10查看本机mac地址的详细操作
今天和大家分享win10查看本机mac地址的方法,mac地址是什么东西?MAC地址实际上就是网卡的一个标识,和身份证号码类似,大多数情况下是不需要关心MAC地址是多少的,一般不能改动,所以也不会重复. ...
- Codeforces Round #292 (Div. 2) C. Drazil and Factorial 515C
C. Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- 从0开始搭建一个阿里云java部署环境
一.购买服务器 https://www.aliyun.com/daily-act/ecs/activity_selection?spm=5176.8112568.738194.8.674c9ed53Y ...