B-烙印
题意:
给你三角形的六个要素其中的三个,
要求你判断:
可以构造出几个三角形。
无穷的话就输出““syksykCCC”
思路:
分类讨论
- 先sss
- 之后aaa
- 再接着aas(asa)。
这里因为有两个角确定,所以第三个角度也易得。(那么有一条边的三角形的形状大致就确定了)
- 接着是sas
- 最后是ssa(这种情况要仔细讨论,可以参考下面的图去讨论)
反思:
本题赛时,思路都对,但因为一些习惯,导致有些地方码歪了。
- sort(s,s+len)。(
前后都要地址
),赛时后面的地址少加1,一直wa。 - 对于eps。(
double
)
a − b > e p s a-b>eps a−b>eps(a>b
)
a − b < − e p s a-b < -eps a−b<−eps(a<b
)
∣ a − b ∣ < e p s |a-b|<eps ∣a−b∣<eps(a=b
)
AC
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define mst(x,a) memset(x,a,sizeof(x))
#define For(i,x,y) for(int i=(x); i<=(y); i++)
double const PI=acos(-1);
double const epx=1e-6;
using namespace std;
const string ans="syksykCCC";
int a[4],s[4];
int angle,side[4];
int pos_angle,pos_side[4];
int main()
{
int tt;cin>>tt;
while(tt--){
angle=0;
mst(side,0);
mst(pos_side,0);
int cnt1=0,cnt2=0,sum=0;
int fl=0;
For(i,1,3)cin>>s[i];
For(i,1,3)cin>>a[i];
For(i,1,3)if(s[i]>0)cnt2++;
For(i,1,3)if(a[i]>0)cnt1++,sum+=a[i];
if(sum>180||cnt1<3&&sum>=180)fl=0;
else {
// cout<<"ok"<<endl;
if(cnt2==3){
sort(s+1,s+1+3);
if(s[1]+s[2]>s[3])fl=1;
else fl=0;
// cout<<"mode-----"<<1<<endl;
}else if(cnt1==3){
if(sum==180)fl=3;
else fl=0;
}else if(cnt1==2&&cnt2==1)fl=1;
else {
//cout<<"mode-----"<<2<<endl;
int cnt2=0;
For(i,1,3)if(s[i]>0)side[++cnt2]=s[i],pos_side[i]++;
For(i,1,3)if(a[i]>0)angle=a[i],pos_angle=i;
if(!pos_side[pos_angle]){
// if((double)(side[1]*side[1])+(double)(side[2]*side[2])-2*side[1]*side[2]*cos(PI*angle/180.0)>epx)fl=1;
// else fl=0;
fl=1;
}else {
int i=1;
for(i=1; i<=cnt2; i++)if(side[i]==s[pos_angle])break;
if(i==2)swap(side[1],side[2]);
if(side[1]<=side[2]&&angle>=90)fl=0;
else if(angle>=90)fl=1;
else {
double h=sin(PI*angle/180.0)*side[2];
if(side[1]>=side[2])fl=1;
else if(h-side[1]>epx)fl=0;
else if(side[1]-h>epx)fl=2;
else fl=1;
//else if(fabs(h-side[1])<epx)fl=1;
}
}
}
}
if(fl<=2)cout<<fl<<endl;
else cout<<ans<<endl;
}
return 0;
}