2017/8/12

来源:互联网 发布:mp4转gif mac 编辑:程序博客网 时间:2024/06/14 09:15

一、跳石头的后续

luoguP2687跳石头在2017/8/12晚上18:43终于AC。主要犯了两个错误

1、二分答案输出后判断left和right中,没有将思路闭合,存在都不满足的情况,导致错误答案;

2、在计数删掉的石头的循环中,flag=i;的赋值语句写成了i=flag;导致整个程序死循环。根据岳老师说的“要给自己上刑”这一方法,我准备晚上在寝室做50个俯卧撑作为惩罚再见

3、总结:有时候在思路正确但是没有过样例的时候,可以采用重新敲一遍代码的方式来查低级错误。。。

二、丢瓶盖    

luoguP1316丢瓶盖在2017/8/12晚上20:18终于AC。

这道题大意和跳石头差不多,只不过跳石头是给出了要删掉的石头个数,这道题丢瓶盖是要保留的瓶盖个数。两道水题目只要在主函数中把稍作处理姐可以了。

然而,然而居然花了半个小时。

错误在

scanf语句中对zb数组进行读入的时候没有给出地址,scanf("%d",&zb[i]);中的&号没加,由于我以前用的版本是5.6.1,这个错误是会报错的,所以没有注意到。不过还是要做俯卧撑。

三、数列分段  

luogu1182数列分段在2017/8/12晚上21:07终于AC。

这道题目主要思想还是二分答案,再去验证。这道题目需要注意的地方就是判断时候到底是赋值left还是right的逻辑问题。附上代码

#include<bits/stdc++.h>
using namespace std;
int m,n,a[110000];
int hy(int x)
{
int tot=0,cc=0;
for(int i=1;i<=n;i++)
{
if(a[i]>x) return 1000000000;
if(tot+a[i]>x)
{
cc++;tot=a[i];
}
else tot+=a[i];
}
return cc+1;
}
int hh()
{
int left_=1,right_=1000000000,mid;


while(left_+1<right_)
{
mid=(left_+right_)/2;
if(hy(mid)>m) left_=mid;
else right_=mid;
}
if(hy(left_)<=m) return left_;
else return right_;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);

printf("%d",hh());
return 0;
}