UVa 110 没有循环的排序程序

题意:构造Pascal的排序程序。初看是写Pascal程序,不了解的以为会很难,但其实程序的大部分是固定的,直接printf就可以,主要在于写比较的if-else部分。

思路:看sample out可以大概知道程序的构成,其他部分直接输出,主要写比较的部分。比较的时候,可以看成两个集合,A是已排好序的,S是全集,cur是从左到右扫描S的当前位置。用递归写的,前半部分是当当前位置cur到达n时,即可以输出了;剩下的是如何填写当前位置cur以及维持A是已排好序的这个性质。将新元素S[cur]从A的最右端往左开始比较,如果新元素S[cur]较大,则直接放在A的当前元素的右边即i+1位置;否则,新元素较小,将A的当前元素右移一位,即拷贝到i+1位置,然后新元素继续与左边一个元素比较。还有一点就是因为数组传到函数后会改变内容的,所以在每次传函数前,新构造一个数组B,复制A数组的内容然后输出。否则的话,不用B数组,直接传A数组,对于两个元素没问题,对于三个元素的话,在if
a<b 这个部分是正确的,而在这个条件开启的else里面就会发现没有a了,而又两个c,这就是因为递归虽然返回了,但数组A已被修改,第一位a已被修改为c。另外,题目没有说缩进的要求,果然提交后发现每行的缩进是没有要求的,只要保证writeln语句单独在一行即可。

本地修改多次,一次AC,取得当前所做所有题目中最高排名74,之前最好是11234题排79。就是做得太慢了,想了好久才会,开始也在考虑缩进的问题、毕竟sample out中第一个if-else和后来的if-else缩进是不同的。。。

Code:

#include<stdio.h>
#include<string.h>

void solve(int n);
void compare(int n,char *A,char *S,int cur);

char str[]="abcdefghijklmn"; 

int main()
{
  int m;
  scanf("%d",&m);
  while(m-->0)
  {
    int n;
    scanf("%d",&n);
    solve(n);
    if(m) printf("\n");
  }
  return 0;
}

void solve(int n)
{
  printf("program sort(input,output);\n");
  printf("var\n");
  for(int i=0;i<n-1;++i) printf("%c,",str[i]);
  printf("%c : integer;\n",str[n-1]);
  printf("begin\n");
  printf("  readln(");
  for(int i=0;i<n-1;++i) printf("%c,",str[i]);
  printf("%c);\n",str[n-1]);
  char A[10];
  compare(n,A,str,0);
  printf("end.\n");
}

void compare(int n,char *A,char *S,int cur)
{
  if(cur==n)
  {
    printf("writeln(");
    for(int i=0;i<cur-1;++i) printf("%c,",A[i]);
    printf("%c)\n",A[cur-1]);
    return ;
  }
  for(int i=cur-1;i>=0;--i)
  {
    printf("  if %c < %c then\n",A[i],S[cur]);
    A[i+1]=S[cur];
    char B[10];
    strcpy(B,A);
    compare(n,B,S,cur+1);
    printf("else\n");
    A[i+1]=A[i];
    A[i]=S[cur];
    //compare(n,A,S,cur+1);
  }
  A[0]=S[cur];//初始cur=0时
  char B[10];
  strcpy(B,A);
  compare(n,B,S,cur+1);
}
时间: 2024-10-10 23:29:04

UVa 110 没有循环的排序程序的相关文章

UVa 11330 (置换 循环的分解) Andy&#39;s Shoes

和UVa11077的分析很类似. 我们固定左脚的鞋子不动,然后将右脚的鞋子看做一个置换分解. 对于一个长度为l的循环节,要交换到正确位置至少要交换l-1次. 1 #include <cstdio> 2 #include <cstring> 3 #include <map> 4 using namespace std; 5 6 bool vis[10000 + 10]; 7 8 int main() 9 { 10 //freopen("in.txt",

Uva 110 - Meta-Loopless Sorts(!循环,回溯!)

题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=46  Meta-Loopless Sorts  Background Sorting holds an important place in computer science. Analyzing and implementing various so

Uva 12299 带循环移动的RMQ(线段树)

题目链接:https://vjudge.net/contest/147973#problem/C 题意:传统的RMQ是一个不变的数组a求区间最值.现在要循环移动(往前移动). 分析:求区间问题,很容易想到线段树,西东就相当于单点更新. 建树,有两种方案,第一种是nlogn,就是不断的更新,更新logn,有n个数. 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 6 const int INF = 1000000000; 7 con

UVA - 110

 Meta-Loopless Sorts  Background Sorting holds an important place in computer science. Analyzing and implementing various sorting algorithms forms an important part of the education of most computer scientists, and sorting accounts for a significant

浅谈libevent的使用--事件和数据缓冲

首先在学习libevent库的使用前,我们还要从基本的了解开始,已经熟悉了epoll以及reactor,然后从event_base学习,依次学习事件event.数据缓冲Bufferevent和数据封装evBuffer等,再结合具体的几个实例来了解libevent库的一些基本使用,有助于我们理解它的一些内部实现(由于之前我已经写过一篇epoll反应堆模型的,所以这里就不再介绍,直接从event_base开始介绍). libevent下载与安装: 在官网上找到 libevent-2.0.22-sta

慕课网笔记之oracle开发利器-PL/SQL基础

实例1--if语句 /* 慕课网Oracle数据库开发必备之PL/SQL_2-3 判断用户从键盘输入的数字 1.如何使用if语句 2.接收一个键盘的输入(字符串) */ set serveroutput on; --接收一个键盘输入 --num:地址值,含义是:在该地址上保存了输入的值 accept num prompt '请输入一个数字'; declare --定义变量保存键盘输入的数字 pnum number := &num; begin --执行if语句进行条件判断 if pnum=0 

huffman编码【代码】

哈夫曼编码应该算数据结构"树"这一章最重要的一个问题了,当时大一下学期学的时候没弄懂,一年后现在算是明白了. 首先,讲讲思路. 正好这学期在学算法,这里面就用到了贪心算法,刚好练练手. 整个问题有几个关键点: 1,首先是要思考怎么样存下从txt中读取的一个所有字符中每种字符出现的次数,首先想到的应该是结构体数组,再仔细想想不对呀,时间复杂度太高了,每次判断一个字符都对知道它属于结构体数组中的哪一个,那要是txt中有很多字符,那光这个就得花好多时间.然后想想,如果读取的字符如果只有那25

MVC学习一:EF

目录 一.EF修改和删除的多种方法 二.标准查询where 三.include 四.skip take 五.反射获取实例属性 六.EF DLL数据访问帮助类 一.EF修改和删除的多种方法 方法1:官方推荐 先查询在修改 或者删除 1 var student = db.Students.FirstOrDefault(t => t.Id == Mid); 2 student.Name = "修改后";//修改值数据 3 db.SaveChanges();//保存 4 db.Stude

笔试算法题(45):AC自动机(Aho-Corasick Automation)

议题:AC自动机(Aho-Corasick Automation) 分析: 此算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一:一个常见的例子就是给定N个单词,给定包含M个字符的文章,要求确定多少个给定的单词在文章中出现过:AC自动机在匹配文本时不需要回溯,处理时间复杂度与pattern无关,仅是target的长度O(N):构建AC自动机的时间复杂度: 与KMP算法类似,AC自动机也是利用前一个匹配模式串失效之后得到的信息来确定下一个匹配的开始位置,从而避免回移主串的匹配指针:与KM