(1)2017.7.20
NYOJ 12 喷水装置(二)
- 区域覆盖 圆转化为线段覆盖
- 左坐标从小到大排序,从起点开始找右坐标最远的;然后再把它当作新的起点
- 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)二分查找+贪心
- 最小值的最大值
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的最大化