• poj 3273Monthly Expense解题报告


    poj 3273-Monthly Expense链接:http://poj.org/problem?id=3273

    这样的在最优情况下找最短时间的题一般都可以二分,当然还可以dp,但是因为本题的数据较大,dp会很耗时,也会很费空间,所以用二分的方法,从max(a[i])到sum(a[i])进行逼近。

    View Code
     1 #include<stdio.h>
    2 #include<string.h>
    3 #define MAX 305
    4 int v[MAX];
    5 int main()
    6 {
    7 int n,m;
    8 int sum,max;
    9 int i;
    10 int l,r,mid;
    11 int t;
    12 scanf("%d",&t);
    13 while(t--)
    14 {
    15 scanf("%d%d",&n,&m);
    16 sum=0;
    17 max=0;
    18 for(i=0;i<n;i++)
    19 {
    20 scanf("%d",&v[i]);
    21 sum+=v[i];
    22 if(v[i]>max)
    23 max=v[i];
    24 }
    25 r=sum;
    26 l=max;
    27 int sumstep,mins;
    28 while(l<r)
    29 {
    30 mid=(l+r)>>1;
    31 sumstep=mins=0;
    32 for(i=0;i<n;i++)
    33 {
    34 sumstep+=v[i];
    35 if(sumstep>mid)
    36 {
    37 sumstep=0;
    38 mins++;
    39 i--;//从这个节点重新开始计算
    40 }
    41 }
    42 mins++;
    43 if(mins>m)
    44 l=mid+1;
    45 else
    46 r=mid-1;
    47 }
    48 printf("%d\n",l);
    49 }
    50 return 0;
    51 }
  • 相关阅读:
    Hibernate初学
    表分区
    单列函数
    Oracle基础
    8.28
    SpringMVC
    SpringMVC 初级操作
    试题评测
    Mybatis

  • 原文地址:https://www.cnblogs.com/caozhenhai/p/2435380.html
Copyright © 2020-2023  润新知