• hdu1687 Lucky Light


    哎,一道这样的题就被整成这样,太粗心了

    题意:已知一个点光源,和N条线段,求在光源照射下,在x轴上有多少个亮的区域

    分析:先求出投影到x轴上的N个区间,然后就是简单的区间覆盖问题了

    View Code
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int xl,yl;
    struct seg
    {
    int x1,y1,x2,y2;
    double xx1,xx2;
    }s[101];
    bool cmp(seg a,seg b)
    {
    return a.xx1<b.xx1;
    }
    double max(double a,double b)
    {
    if(a>b)
    return a;
    return b;
    }
    double get_x(int x,int y)
    {
    if(x==xl)
    return (double)x;
    else
    return (double)(y*xl-yl*x)/(double)(y-yl);
    }
    int main()
    {
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
    scanf("%d",&n);
    scanf("%d %d",&xl,&yl);
    for(int i=0;i<n;i++)
    scanf("%d %d %d %d",&s[i].x1,&s[i].y1,&s[i].x2,&s[i].y2);
    for(int i=0;i<n;i++)
    {
    s[i].xx1=get_x(s[i].x1,s[i].y1);//这个我不想说什么,真的服了自己了
    s[i].xx2=get_x(s[i].x2,s[i].y2);
    if(s[i].xx1>s[i].xx2)
    swap(s[i].xx1,s[i].xx2);
    }
    sort(s,s+n,cmp);
    int count=0;
    double max1=s[0].xx2;//max1一开始定义成int了,哎
    for(int i=1;i<n;i++)
    {
    if(s[i].xx1>max1)
    {
    count++;
    max1=s[i].xx2;
    }
    else {
    max1=max(s[i].xx2,max1);
    }
    }
    if(n==0)//没考虑到n等于0
    printf("1\n");
    else
    printf("%d\n",count+2);
    }
    return 0;
    }
  • 相关阅读:
    9、 docker容器数据卷
    第十八章 MySQL数据库优化
    第十七章 MySQL的VIP漂移和Atlas
    第十六章 MHA高可用(续)
    第一章 shell基础
    第十五章 MHA高可用
    第十四章 MySQL的各种主从
    第十三章 MySQL的主从复制
    第十二章 MySQL的恢复与备份
    第十一章 MySQL日志详解
  • 原文地址:https://www.cnblogs.com/nanke/p/2347125.html
Copyright © 2020-2023  润新知