第一次写这种什么玩意,求大神指教。
真相如图
洛谷2305 “不断进步”的八尾勇
本题地址: http://www.luogu.org/problem/show?pid=2305
题目描述
noip训练时,我们的勇姐做了大量的模拟比赛——能力有限,当然没法每一场都AK(All Kill)。结果其父过来“关心”她的模拟比赛成绩。
八尾勇为了造成自己不断进步的假象,打算篡改自己的成绩。
她为了对得起自己的良心,不会真的篡改,而是将相邻的两场比赛合并为一场,分数累加,变成了一场分数为之前两场之和的大比赛。
之前题目题意有些歧义更正如下
八尾勇是这么处理的:她从前往后扫一遍成绩,发现第一个“不和谐”的成绩,就将这场比赛并入这场比赛后面的一场比赛。然后如此反复。第一个“不和谐”的意思是一组数列中第一个不满足单调不减的数字。
如果没有后面的比赛可以加,那就加到前面的一个的成绩中去。
新增一组样例
已经合并比赛可以再次进行合并。
八尾勇的父亲只关心分数的高低,才不管满分多少。八尾勇希望通过最少的合并次数,变成一个单调不减的成绩单
输入输出格式
输入格式:
第一行一个整数N
第二行,N个整数,分别表示这N次比赛的成绩
输出格式:
一个整数,表示最小合并次数。
输入输出样例
输入样例#1:
92 3 5 1 2 4 8 7 8输出样例#1:
3输入样例#2:
43 2 6 7输出样例#2:
2
说明
样例解释1
2 3 5 【1 2】 4 8 7 8
2 3 5 【3 4】 8 7 8
2 3 5 7 8 【7 8】
2 3 5 7 8 15
一共合并3次
样例解释2
3 【2 6】 7
3 【8 7】
3 15
2次,而不是直接【3 2】6 7。因为第一个“不和谐”的成绩是2
对于40%的数据,0<=N<=2000
对于100%的数据,0<=N<=200000,成绩的范围均0<=A_i<=2^31-1
这些只是复制的。。。
首先,这只是到简单的模拟(第一次写当然要容易的了。。。)
完全不需要数组!!!读一个处理一个就行了!!!
范围在longlong内
本人AC代码(本人蒟蒻)
#include<iostream> //不解释
#include<cstdio>
using namespace std;
int n,cnt=0;long long q=0,h=0,t; //n是数量,cnt统计,q是前面的那个数,h是后面的,t用来读
int main(){
cin>>n;
while(n--){
scanf("%lld",&t);
h+=t; //读入的数加入后面的数
if(h>=q){ //如果可以不作弊,后面的数就成了前面这个数,后面数归零
q=h;
h=0;
}
else cnt++; //否则作弊
}
printf("%d",cnt); //输出结果啦ORZ
}
P党(未经提交)
var n,cnt,i:longint;
q,h,t:int64;
begin
cnt:=0;
q:=0;
h:=0;
read(n);
for i:=1 to n do
begin
read(t);
h:=h+t;
if(h>=q)
begin
q:=h;
h:=0;
end
else inc(cnt);
end;
writeln(cnt);
end.