贪心

来源:互联网 发布:软件调研方案模板 编辑:程序博客网 时间:2024/06/03 16:25

(1)2017.7.20

NYOJ 12 喷水装置(二)

  1. 区域覆盖 圆转化为线段覆盖
  2. 左坐标从小到大排序,从起点开始找右坐标最远的;然后再把它当作新的起点
  3. d=sqrt(r*r-h*h/4.0); 想当然的以为d都是大于0,忘了可以小于0,一直WA。。就是r比草坪的宽度一半还小的情况
#include <iostream>#include <algorithm>#include <math.h>using namespace std;typedef struct{    float st;    float ed;} Rnode;Rnode a[10005];int n,w,h,ans;bool compare(Rnode a,Rnode b){    return a.st<b.st;}void solve(){    float st=0,maxed=0,former=0;    while(st<w)    {        int flag=0;        for(int i=0; i<n; i++)        {            if(a[i].st>st)                break;            if(st==0||former<a[i].st)            {                if(maxed<a[i].ed)                {                    maxed=a[i].ed;                    flag=1;                }            }        }        if(flag)        {            ans++;            former=st;            st=maxed;        }        else        {            ans=0;            break;        }    }}int main(){    int m;    cin>>m;    while(m--)    {        cin>>n>>w>>h;        int x,r,flag=0;        for(int i=0; i<n; i++)        {            cin>>x>>r;            float d;            d=sqrt(r*r-h*h/4.0);            if(d>0)            {                a[flag].st=x-d;                a[flag++].ed=x+d;            }        }        n=flag;        sort(a,a+n,compare);        ans=0;        solve();        cout<<ans<<endl;    }    return 0;}

(2)2017.7.25

NYOJ 1087 摆方格
<数学规律>
http://m.blog.csdn.net/qq_29070399/article/details/54933964
这个博客讲解很详细

!!输入
输入包含多组测试数据。
每一行包括一个数据n,表示n*n的方格(保证所有数据在2^64范围内且n>0)
所以n不能用int,用 long long

#include <iostream>#include <stdio.h>using namespace std;long long n;int main(){    while(~scanf("%lld",&n))    {        long long ed=n*n+(n-2)*(-2);        long long ans=(n-1)*ed+(n-1)*(n-2)/2*2+ed/2;        cout<<ans<<endl;    }    return 0;}

(3)二分查找+贪心

  1. 最小值的最大值
    NYOJ 586 疯牛
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int n,m;int a[100005];bool judge(int k){    int st=a[0];    int count=1;    for(int i=1;i<n;i++)        if(a[i]-st>=k)        {            count++;            if(count>=m)                return true;            st=a[i];        }    return false;}int binary_search(){    int left=0;    int right=a[n-1]-a[0];    int mid=(left+right)>>1;    while(left<=right)    {        if(judge(mid))            left=mid+1;        else            right=mid-1;        mid=(left+right)>>1;    }    return left-1;}int main(){    while(~scanf("%d%d",&n,&m))    {        for(int i=0; i<n; i++)            cin>>a[i];        sort(a,a+n);        cout<<binary_search()<<endl;    }    return 0;}

2.
Yougth的最大化

原创粉丝点击