题解
三角形
这题……真的是省选吗?
首先,有一个很重要的性质!!!
观察这幅图(题目里的):
每个三角形最多与个三角形相邻!!!
理论解释:
首先我们知道,
如果B不包含A,且A的某一条完整的边是B的某条边的一部分,则我们说A靠在B的边上 ---P4536 [CQOI2007]三角形
解读这句话:的某一条完整的边是B的某条边的一部分
对于三角形:
有三条边(废话)
每条边都(可能)有一个三角形与
相邻,根据定义,B的边长≥A的边长。所以A的这条边上不可能再有别的与
相邻的三角形(重要!!)
那么就是说每条边上最多只有1个三角形与它相邻
那么最多只有个三角形与它相邻啊!!!
这样一分析,哇!水题!!
再分析第二步:
还是这张图:
与
相邻,然后没了(有
个了,
掉结束)
与
相邻。
还有一种特殊情况:有的三角形一条或两条边在边界上(像与
)就会少于三个。
于是乎如果有一个数字出现多次,就掉了
#include<algorithm> #include<bitset> #include<cmath> #include<cstdio> #include<cstring> #include<map> #include<iostream> #include<queue> #include<set> #include<stack> #include<string> #include<vector> using namespace std; #define ll long long #define f(i,a,b) for(int i=a;i<=b;i++) inline ll rr() { ll x=0,f=1; char c=getchar(); while(c<'0'||c>'9')c=getchar(); if(c=='-')f=-1,c=getchar(); while(isdigit(c))x=x*10+c-'0',c=getchar(); return x*f; } #define d rr() ll cmp; bool fl[5]; string s[100010],k; char opt; int main() { char c; cin>>c>>k; while(k.size()){ if(cmp==3){ break; } string qqq; if(k[k.size()-1]!='4'){ if(!fl[k[k.size()-1]-'0']){ cmp++; s[cmp]+='T'; s[cmp]+=k; s[cmp][s[cmp].size()-1]='4'; } } else{ cmp++; s[cmp]+='T'; s[cmp]+=k; s[cmp][s[cmp].size()-1]='1'; cmp++; s[cmp]+='T'; s[cmp]+=k; s[cmp][s[cmp].size()-1]='2'; cmp++; s[cmp]+='T'; s[cmp]+=k; s[cmp][s[cmp].size()-1]='3'; sort(s+1,s+cmp+1); cout<<s[1]; for(int i=2;i<=cmp;i++)cout<<endl<<s[i]; return 0; } fl[k[k.size()-1]-'0']=1; for(int i=0;i<k.size()-1;i++)qqq+=k[i]; k=qqq; } sort(s+1,s+cmp+1); cout<<s[1]; for(int i=2;i<=cmp;i++)cout<<endl<<s[i]; return 0; }
谢谢!!