刷题记录(NC16783 拼数,NC16618 排座椅)

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值