题解
三角形
这题……真的是省选吗?
首先,有一个很重要的性质!!!
观察这幅图(题目里的):
每个三角形最多与个三角形相邻!!!
理论解释:
首先我们知道,
如果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;
}谢谢!!



京公网安备 11010502036488号