NC16783 拼数
题目链接
关键点:
1、贪心策略:观察如何取得最大数,首先想到的是对于两个数,从最高位开始比较,大的就排前面,但这样会产生一种矛盾,比如对于,334和33谁放前和谁放后的问题
2、因此采用拼接两个字符串(a,b),比较a+b,b+a谁大,然后按照这样排序,最后输出
完整代码:
# include <iostream>
# include <cstdio>
# include <algorithm>
# include <cstring>
using namespace std;
int n;
string s[30];
bool cmp(string s1, string s2)
{
return s1+s2>s2+s1;
}
int main()
{
scanf("%d", &n);
for (int i=1; i<=n; i++)
{
cin>>s[i];
}
sort(s+1, s+1+n, cmp);
for (int i=1; i<=n; i++)
cout<<s[i];
return 0;
}
NC16618 排座椅
题目链接
关键点:
1、要使每个行和列的走道分开的组数最多,所以对所有可以分开的行列分别从大到小排序
2、题目还要求输出的k(行)和l(列)要按照从大到小的顺序,最好开两个结构体数组,一个存行一个存列,这个结构体不仅存可以分割组的个数,还存当前的行(列),然后再按照行(列)从大到小排序
3、最后明确,如果两个左标横坐标相同,那么列可以分,且列取两个坐标纵坐标的最小值,反之纵坐标相同,取横坐标的最小值
完整代码:
# include <cstdio>
# include <iostream>
# include <algorithm>
using namespace std;
int m, n, k, l, d;//k指横向通道,l指纵向通道
struct ty{
int num, pos;
}hang[2000+10], lie[2000+10];
bool cmp1(ty t1, ty t2)
{
return t1.num>t2.num;
}
bool cmp2(ty t1, ty t2)
{
return t1.pos<t2.pos;
}
int main()
{
scanf("%d%d%d%d%d", &m, &n, &k, &l, &d);
for (int i=1; i<=1100; i++)
{
hang[i].pos = i;
lie[i].pos = i;
}
for (int i=1; i<=d; i++)
{
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
if (x1==x2)
{
int le = min(y1, y2);
lie[le].num++;
}
else
{
int ha = min(x1, x2);
hang[ha].num++;
}
}
sort(lie+1, lie+1+m, cmp1);
sort(hang+1, hang+1+n, cmp1);
sort(lie+1, lie+1+l, cmp2);
sort(hang+1, hang+1+k, cmp2);
for (int i=1; i<=k; i++)
cout<<hang[i].pos<<" ";
cout<<endl;
for (int i=1; i<=l; i++)
cout<<lie[i].pos<<" ";
return 0;
}