您的位置:首页 > Web前端

[USACO3.4.3 Electric Fences]

2012-03-03 18:34 501 查看
[关键字]:数学 解析几何

[题目大意]:给出n,m,p,问由(0,0)(n,m)(p,0)围成的三角形型内部有几个由整数构成的点。

//=============================================================================================

[分析]:据说有个皮克定律可以解决,但是本菜不会……所以就用了最笨的解析几何去做。计算出(0,0)和(n,m)构成的直线的解析式是:y=(xm)/n;(n,m)和(p,0)的解析式是:y=(p-x)m/(p-n)然后枚举x,求出对应的y。然后就可算出x这条直线上有几个可以选的点。要注意的是:1、计量避免浮点计算,否则很不好办;2、要分三种情况讨论:p>n p==n p<n,其实三种情况都很想代码也差不多,边界考虑清楚代码完全可也copy。

[代码]:

View Code

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int N,M,P,ans=0;

int main()
{
scanf("%d%d%d",&N,&M,&P);
//printf("%d %d %d\n",N,M,P);
for (int i=1;i<=N;i++)
{
int y1=(i*M)/N;
float y2=((float)i*M)/(float) N;
//printf("%d %.2f %d\n",i,y2,y1);
if (y1==y2) ans+=y1-1; else ans+=y1;
}
//printf("%d\n",ans);
if (P>N)
{
for (int i=N+1;i<P;i++)
{
int y1=(M*(P-i))/(P-N);
float y2=((float)M*(P-i))/(float) (P-N);
//printf("%d %.2f %d\n",i,y2,y1);
if (y1==y2) ans+=y1-1; else ans+=y1;
}
//printf("%d\n",ans);
}
if (P<=N) ans-=M-1;
//printf("%d\n",(P<N));
if (P<N)
{
for (int i=P+1;i<N;i++)
{
int y1=(M*(P-i))/(P-N);
//printf("%d %.2f %d\n",i,y2,y1);
ans-=y1;
}
//printf("%d\n",ans);
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: