区间损坏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;
}

    

    

文章结束给大家分享下程序员的一些笑话语录: 腾讯总舵主马化腾,有人曾经戏称如果在Z国选举总统,马化腾一定当选,因为只要QQ来一个弹窗”投马总,送Q币”即可。

你可能感兴趣的:(HDU)