整理页码问题
以下是题目Description
cxlove平时喜欢在网上阅读一下资料,然后把自己觉得有价值的页码都记录一下,最后统计去打印一份,但是自己却没有一点逻辑性而且记性很差。
每次都可能随意翻开几页,觉得有价值,便会在一个txt上记录一下页码。一段时间之后,cxlove发现自己已经记录下长长的一串页码,很显然也有许多重复的页码,如果将txt交给打印工作人员的话,同一页可能会打印多次,太浪费了。
所以cxlove希望你能帮他完成整理页码的工作,将所有的页码表示成区间,格式如下:
l1-r1,l2-r2,……,lk-rk 其中[li,ri]表示区间内的页码都是需要打印的,要求li<=ri,而且区间不能重叠且区间按页码递增顺序排列。
如果li=r1,则不需要表示成li-ri,只需要输出li
cxlove希望用最少的区间来表示自己的打印需求。
Input
一个整数 T,表示有 T 组测试数据。(1<=T<=30)
每组数据输入格式如下:
第一行,一个整数n,表示cxlove总共记录下n个页码
第二行,一串用","隔开的页码。表示cxlove记录下的页码,页码之间用","隔开。最少包括1个页码,最多不超过100个页码,其中资料不超过1000页。
测试数据保证合法,不会以","开头也不会以","结尾。同时相邻的两个页码之间有且仅有一个","分隔。
Output
对于每一组数据,输出仅一行,整理之后用区间表示的页码
参见sample,请不要输出多余的空格,符号等
Sample Input
Original Transformed
2
9
1,2,3,1,1,2,6,6,2
3
30,20,10
Sample Output
Original Transformed
1-3,6
10,20,30
我写的代码是:
#include<stdio.h>
#include<string.h>
int p[1000];
int main()
{
int n,s,m,k,j,f=0;
char ch;
scanf("%d", &s);
while (s--)
{
int g=0,flag=0,q=0,*h;
k = j = f=0;
memset(p, 0, sizeof(p));
scanf("%d", &m);
while (m--)
{
scanf("%d%c", &n, &ch);
if(p[n]==0)p[n] = n;
if (p[n] > f)f = p[n];
}
for (int i = 1;i < f+1;i++)
{
if (i == f-1)
g = 0;
if (p[i] != 0 && k != 0)
{
j = i;
q++;
}
if (p[i] != 0 && k == 0)
{
k = i;
h = &p[i];
q++;
}
if (p[i] == 0 && j == 0&&k!=0)q=k = 0;
if (p[i] == 0 && k != 0 && j != 0)
{
if (g)printf(",");
printf("%d-%d", k, j);
g = 1;
memset(h, 0, q*sizeof(int));
k = j = 0;
}
}
for (int i = 0;i < f+1;i++)
printf("%d ", p[i]);
for (int i = 1;i < f+1;i++)
{
if (g == 1&&i!=f-1&&p[i]!=0)printf(",");
if (p[i] != 0)
printf("%d", p[i]);
}
printf("\n");
}
return 0;
}
求连续页数的部分运行不出来,相当于无效代码一样,是出了什么问题吗?
另外,请问各大神有简便的方法做这题吗?求解!
[此贴子已经被作者于2016-1-29 15:29编辑过]