题目链接详见SCNU 2015新生网络赛 1007. ZLM的扑克牌
 
      其实我在想这题的时候,还想过要不要设置求最小的排列,并且对于回文数字的话,可以把扑克牌折起来(从而这个数字会变小);甚至要不要设置扑克牌旋转、翻转之后,读出的数字要改变。但这样的话好像我也不会做辣!= =|||于是这道题目最后就变成了一个简单贪心题。题目大意大概就是这样的:给出一个包含$n$个数字的多重集,要求使用集合中的元素拼凑出一个最大的数字,问最大所能拼凑出的数字是多少?
 
      贪心算法需要对贪心策略进行证明。比如大部分同学可能会想到的是,做一个简单的排序,把数字大的排在前面,数字小的排在后面,然后按顺序输出就好啦!但很可惜这是错的!因为对于$12345$,它比$67$要大,但$67$应该排在它的前面,因为$1234567$是小于$6712345$的。
 
      我们考虑两个数字串$A$和$B$,组合得到一个新的数字串$AB$或$BA$,定义关系$\succ$,当且仅当$AB > BA$严格成立时,$A \succ B$成立。对于集合中另一个数字串$C$且$A \succ B$,如果$C \succ A$,则一定满足$C \succ B$;如果$B \succ C$,则一定满足$A \succ C$;否则应当再进行一次比较以确定$A$、$B$、$C$三者的序关系。对于全集$S_{N}$,至多进行有限次即$O(N^{2})$的比较可以使整个集合满足全序关系,于是基于这种比较的排序方法可行。
 
      接下来考虑下代码,因为输入输出量比较大,而时限只有1s,所以C++的输入输出方法被卡得死死的,只要使用了就一定会TLE。另外STL的string类也会导致TLE,这个我原先倒是没想过要卡的,但至少给大家一个警醒,不要滥用STL,STL大概为了做到泛型编程和通用性,通常会损失一些性能,因此在某些时候远不及于自己写的代码。
 #include <stdio.h>
#include <stdlib.h>
#include <string.h> namespace cmp {
char tx[], ty[];
int compare(const void*a, const void*b) {
strcat(strcpy(tx, (char*)a), (char*)b);
strcat(strcpy(ty, (char*)b), (char*)a);
return strcmp(ty, tx);
}
} char x[][];
int main() {
int cse, T, N, i;
scanf("%d", &T);
for(cse=; cse<=T; cse++) {
printf("Case #%d:\n", cse);
scanf("%d", &N);
for(i=; i<N; i++)
scanf("%s", x[i]);
qsort(x, N, , cmp::compare);
for(i=; i<N; i++)
printf(x[i]);
puts("");
}
return ;
}
 
      上面的代码用了C++的命名空间,你也可以选择用函数内静态变量,或直接暴露成全局变量。其中利弊请自行体会= =||
      另外注意一下我在qsort的compare中写的是strcmp(ba,ab),其中原因请参看strcmp函数返回值说明以及qsort函数参数说明,并注意一下$a$和$b$之间的关系。
 
      附:数据生成程序如下:
 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h> int main() {
freopen("in.txt", "w+", stdout);
int T = ;
printf("%d\n", T);
srand(time(NULL));
for(int a=; a<=; a++)
for(int b=; b<a*; b++) {
int N = rand()%((int)pow(, a)-)+;
printf("%d\n", N);
for(int i=; i<N; i++) {
int X = rand()%((int)pow(, -a)-)++(int)pow(rand()%, -a);
printf("%d ", X);
}
puts("");
}
return ;
}

Click To

 

SCNU 2015ACM新生赛初赛【1007. ZLM的扑克牌】解题报告的更多相关文章

  1. SCNU 2015ACM新生赛初赛【1006. 3D打印】解题报告

            题目链接详见SCNU 2015新生网络赛 1006. 3D打印 .出题思路来自codevs 3288. 积木大赛,属于模拟题.         首先我们把“选择从第L部分到第R部分”理 ...

  2. SCNU 2015ACM新生赛初赛【1001~1011】个人解题思路

            题目1001:       大意:已知$n$个角色,$m$种怪物种族,$k$个怪物,给出一组角色编号,编号$P_{i}$的角色能肝死编号$i$的怪物,对于给定的一组怪物编号,为了打通关 ...

  3. SCNU 2015ACM新生赛决赛【F. Oyk闯机关】解题报告

            题目大意:一个$N$$\times$$N$的阵列,每个格子有$X_{ij}$个调和之音,若每次只能选择走右边或下边,从左上角出发走到右下角,问最多能收集到多少个调和之音?       ...

  4. 【百度之星2014~初赛(第二轮)解题报告】Chess

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  5. 【百度之星2014~初赛(第二轮)解题报告】JZP Set

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  6. SCNU ACM 2016新生赛初赛 解题报告

    新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...

  7. 【贪心+中位数】【新生赛3 1007题】 Problem G (K)

    Problem G Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  8. 安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告

    [POI2010]CHO-Hamsters 题意: 给出n个互不包含的字符串,要求你求出一个最短的字符串S,使得这n个字符串在S中总共至少出现m次,问S最短是多少? 范围: \(1 \le n \le ...

  9. 【HHHOJ】ZJOI2019模拟赛(十三)03.10 解题报告

    点此进入比赛 得分: \(97+0+10=107\) 排名: \(Rank\ 3\) \(Rating\):\(+47\) \(T1\):[HHHOJ187]Hashit(点此看题面) 容易想到可以用 ...

随机推荐

  1. 【解决方案】cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One of '{"http://java.sun.com/xml/ns/javaee":run-as, "http://java.sun.com/xml/ns/javaee":security-role-r

    [JAVA错误] cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One o ...

  2. MVC5 网站开发之八 栏目功能 添加、修改和删除

    本次实现栏目的浏览.添加.修改和删除. 栏目一共有三种类型. 常规栏目-可以添加子栏目,也可以添加内容模型.当不选择内容模型时,不能添加内容. 单页栏目-栏目只有一个页面,可以设置视图. 链接栏目-栏 ...

  3. react+redux教程(七)自定义redux中间件

    今天,我们要讲解的是自定义redux中间件这个知识点.本节内容非常抽象,特别是中间件的定义原理,那多层的函数嵌套和串联,需要极强逻辑思维能力才能完全消化吸收.不过我会多罗嗦几句,所以不用担心. 例子 ...

  4. linux内核数据结构之kfifo

    1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...

  5. LINQ to SQL语句(17)之对象加载

    对象加载 延迟加载 在查询某对象时,实际上你只查询该对象.不会同时自动获取这个对象.这就是延迟加载. 例如,您可能需要查看客户数据和订单数据.你最初不一定需要检索与每个客户有关的所有订单数据.其优点是 ...

  6. C# 本质论 第四章 方法和参数

    要为方法名使用动词或动词短语 递归:递归调用方法 方法重载: try catch

  7. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  8. 浅谈Slick(4)- Slick301:我的Slick开发项目设置

    前面几篇介绍里尝试了一些Slick的功能和使用方式,看来基本可以满足用scala语言进行数据库操作编程的要求,而且有些代码可以通过函数式编程模式来实现.我想,如果把Slick当作数据库操作编程主要方式 ...

  9. 生成Tab键或逗号分隔的CSV

    <?php header("Content-type:text/csv;charset=utf-8"); header("Content-Disposition:a ...

  10. 初识Servlet

    1.创建DispatcherServlet package myservlet; import java.io.IOException; import javax.servlet.ServletExc ...