HDU4132 noj[1304] BJF: How Far Can Drive At Most 区间叠加 计算和 超级帅的题目

  • [1304] BJF: How Far Can Drive At Most

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • Now I am going to drive on a street. The street is a straight line. It will cost me one unit oil per meter. And my car can contain V units at most. Unfortunately some zones of the street have been damaged badly. The number of damaged zones is Q. One zone is represented as (l, r, C), means the zone between l to r is damaged, and it will cost me another C units of oil per peter. Please notice that zones may intersect. My question is how far can I drive at most.


  • 输入
  • Several cases(cases <= 10). The first line is the case number T. Then T cases follow. For each case : First line two integers l (indicating the length of the street) and V (indicating the amount of oil my car can contain at most when I start)(1 <= len, V <= 10 ^ 9). Second line of each case is an integer Q (0 <= Q <= 50000). Then Q lines follow, each with three integers (l, r, C), means the zone between l to r has been damaged and it will cost me another C units of oil per meter(1 <= l < r <= len, 1 <= C <= 100).
  • 输出
  • For each case, print the farthest I can drive, and output it with exactly two digits after the decimal point.
  • 样例输入
  • 2
    100 100
    2
    10 20 5
    10 30 14
    1000 10000
    3
    10 20 4
    10 30 14
    10 15 5
  • 样例输出
  • 14.50
    1000.00
  • 提示
  • 来源
  • 加多宝凉茶


http://acm.hdu.edu.cn/showproblem.php?pid=4132

http://acm.nbut.cn:8081/Problem/view.xhtml?id=1304

题意:

有一条直线街道,因为有些区段有着不同程度的损坏,导致通过的车辆会消耗不同的油量。在没损坏的路上行驶是每米消耗 1 单位的油。

现在给出街道的总长 l 和总油量 v ,以及给出 Q 组损坏区间的耗油量(每米)。如果区间有重叠,则耗油量应该累加计算。

你需要计算出在这 v 单位的油量下,从原点出发最多行驶多少米



思路:

先拆分区间再对区间排序,逐个处理加判断

具体看代码

#include<stdio.h>
#include<algorithm>
using namespace std;
struct NODE
{
	int pos;
	int cost;
	 bool operator < (const NODE &aa) const
     {
        return pos < aa.pos;
     }
}a[2*50000+2];
int n,len,cnt;
double v;
void solve()
{
	int i,j;
	double cost=0;
	i=0;
	while(i<cnt)
	{
	    j=i;
		while(j<cnt)
		{
			if(a[i].pos!=a[j].pos) break;
			cost+=a[j].cost;
			j++;
		}
		if(v-(a[j].pos-a[i].pos)*cost<=0)
		{
               printf("%.2lf\n",a[i].pos+v/cost);
			   return ;
		}
		v=v-(a[j].pos-a[i].pos)*cost;
		i=j;

	}
	printf("%.2lf\n",(double)a[cnt-1].pos);
}
int main()
{
	int cas;
      scanf("%d",&cas);
	  while(cas--)
	  {
		  int left,right,c;
		  cnt=0;
		  scanf("%d %lf",&len,&v);
		  scanf("%d",&n);
		  int i;
		  a[cnt].pos=0;
		  a[cnt].cost=1;
		  cnt++;
		  for(i=0;i<n;i++)
		  {
			  scanf("%d %d %d",&left,&right,&c);
			  a[cnt].pos=left;
			  a[cnt].cost=c;
			  cnt++;
			  a[cnt].pos=right;
			  a[cnt].cost=-c;
			  cnt++;
		  }
		  a[cnt].pos=len;
		  a[cnt].cost=-1;
		  cnt++;
		  sort(a,a+cnt);
		 // for(i=0;i<cnt;i++)
		//	  printf("%d\n",a[i].pos);
		  solve();
	  }
	  return 0;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值