专栏文章
题解:P13467 [GCJ 2008 #2] Triangle Areas
P13467题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miomwa65
- 此快照首次捕获于
- 2025/12/02 21:48 3 个月前
- 此快照最后确认于
- 2025/12/02 21:48 3 个月前
题目分析
一道比较考察思维能力的题。
首先给出几个显而易见而十分重要的事实:
- 三角形平移后面积不变。
- 三角形某个顶点沿与其对边平行的方向平移,三角形面积不变(等底等高)。
由上面两条事实可以发现,对于钝角三角形,根据第二条事实,平移某个顶点使其成为锐角三角形,然后根据第一条事实,可以把三角形平移使得某个顶点位于原点。因此可以将三角形的一个顶点锁定在 ,并且只需考虑锐角三角形的情况(之所以要锐角三角形,是防止有顶点的坐标为负)。下面用两张图解释上面说的:

如图,蓝色三角形就是我们变换后最终想要的三角形,而黄色三角形由于是钝角三角形,,因此必然有一个点的坐标是负数,如图中的 点,不满足题意,因此我们要求是锐角三角形。

如图,这张图片展示了如何从钝角三角形变为锐角三角形。图中 ,因此 且 是锐角三角形。这就是为什么我们只需要考虑锐角三角形的情况。
对于一般三角形,若顶点 ,, 的坐标分别为 ,,,我们有面积公式:
由于我们把某一点(设为 点)移至了原点,因此 ,所以上述行列式的结果就为 。所以我们有 。因此我们要取适当的 ,,, 满足每个 都位于 到 之间,每个 都位于 到 之间且满足 。下面有一个好的构造。
设 为满足 的最大正整数,则我们取 ,,, 即可满足要求。证明:
首先验证 。我们有
然后验证 和 的范围。首先 ,。假设 ,则 ,变形得 ,这与 的定义矛盾。因此 。而 。因此范围符合题意。
下面看什么时候无解,显然就是 取不到,也就是 的时候。
以上就解决了这道题。
代码
CPP#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
for(int o=1;o<=t;o++){
cout<<"Case #"<<o<<": ";
long long n,m,a;
cin>>n>>m>>a;
if(a>m*n){
cout<<"IMPOSSIBLE"<<endl;
continue;
}
cout<<0<<' '<<0<<' ';
long long m0=0;
for(long long i=0;i<=m;i++){
if(n*(m-i)>=a&&n*(m-i-1)<a){
m0=i;
break;
}
}
cout<<n<<' '<<1<<' '<<(m-m0)*n-a<<' '<<m-m0<<endl;
}
return 0;
}
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...