码迷,mamicode.com
首页 > 其他好文 > 详细

poj3273---Monthly Expense

时间:2018-08-25 21:50:44      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:最大   alt   答案   条件   pre   mon   死循环   line   变换   

tips:

  1.用条件判断左右区间该怎么更新

  2.答案在区间范围内是否是整数变化

  3.这个区间变换还是没有搞的太懂

  4.二分超时的原因是二分的区间更新写错了

  5.最大化最小值??

技术分享图片
//二分超时很大一部分原因是二分时陷入了死循环
//http://zhenzxie.iteye.com/blog/1446986
//https://www.cnblogs.com/helica/p/5173800.html
#include<cstdio>
using namespace std;
const int MM=100010;
int a[MM];
int n,m;
int L,R;
int summ;
int judge(int x){
    int ans=1;
    int sum=0;

    for(int i=0;i<n;i++){
       if(sum+a[i]<=x){
            sum+=a[i];
       }
       else{
            ans++;
            sum=a[i];
       }
    }
    //ans=summ/x;
    return ans;
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        int tmp=0;
        R=0;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            if(a[i]>tmp){
                tmp=a[i];
            }
            R+=a[i];

        }
        L=tmp;
        summ=R;
        while(L<R){//等于的话不用判断,确定了唯一的位置
            int mid=L+(R-L)/2;
            if(judge(mid)<=m){
                R=mid-1;
            }
            else{
                L=mid+1;
            }

        }
        printf("%d\n",L);

    }
    return 0;
}
View Code

   6.还可以不对 ==号进行处理---解决模糊问题?比如说5.

技术分享图片
//二分超时很大一部分原因是二分时陷入了死循环
//http://zhenzxie.iteye.com/blog/1446986
//https://www.cnblogs.com/helica/p/5173800.html
#include<cstdio>
using namespace std;
const int MM=100010;
int a[MM];
int n,m;
int L,R;
int summ;
int judge(int x){
    int ans=1;
    int sum=0;

    for(int i=0;i<n;i++){
       if(sum+a[i]<=x){
            sum+=a[i];
       }
       else{
            ans++;
            sum=a[i];
       }
    }
    //ans=summ/x;
    return ans;
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        int tmp=0;
        R=0;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            if(a[i]>tmp){
                tmp=a[i];
            }
            R+=a[i];

        }
        L=tmp;
        summ=R;
        while(L<R){//等于的话不用判断,确定了唯一的位置
            int mid=L+(R-L)/2;
            if(judge(mid)<m){
                R=mid-1;
            }
            if(judge(mid)>m)
                L=mid+1;
            }

        }
        printf("%d\n",L);

    }
    return 0;
}
View Code

 

poj3273---Monthly Expense

标签:最大   alt   答案   条件   pre   mon   死循环   line   变换   

原文地址:https://www.cnblogs.com/SUMaywlx/p/9535456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!