problem 1076

传说中的背诵题,最长****子串。所有的代码都是现成的,只需要把类型改成结构再调整一下输入输出。

不小心PE了一次T_T!

Accepted1076C++00:00.00432K

#include<stdio.h>
#include
<string.h>
#include
<stdlib.h>
#define swap(x,y) if(x != y){x = x^y; y = y^x; x = x^y;}
typedef 
struct  s
{
    
int
 start;
    
int
 end;
    
int
 index;
}Gen;
void sort(Gen* a,int p,int
 r)
{
  
while (p <
 r)
  {
    
int i = p - 1
;
    
int x =
 a[r].start;
    
for(int j = p; j < r; j++
)
    {
        
if(a[j].start <=
 x)
        {
            i
++
;
            swap(a[i].start,a[j].start);
            swap(a[i].end,a[j].end);
            swap(a[i].index,a[j].index);
        }
    }
    i
++
;
    swap(a[i].start,a[r].start);
    swap(a[i].end,a[r].end);
    swap(a[i].index,a[r].index);
    sort(a,p,i 
- 1
);
    p 
= i + 1
;
  }
}
void solve(int
 n)
{
    Gen
* g = (Gen*)malloc(sizeof(Gen) *
 n);
    
int* m = (int*)malloc(sizeof(int*
 n);
    
int* res = (int*)malloc(sizeof(int*
 n);
    memset(m,
0,sizeof(int*
 n);
    memset(res,
0,sizeof(int*
 n);
    
int
 i,j;
    
for(i = 0; i < n; i++
)
    {
        scanf(
"%d%d",&g[i].start,&
g[i].end);
        g[i].index 
=
 i;
    }
    sort(g,
0,n - 1
);
    m[
0= 1
;
    
for(i = 1; i < n; i++
)
    {
        
int max = 0
;
        
for(j = 0; j < i; j++
)
        {
            
if(g[j].end <
 g[i].start)
                max 
= max > m[j] ?
 max : m[j];
        }
        m[i] 
= ++
max;
    }
    
int len = 0
;
    
for(i = 0; i < n; i++
)
        
if(len <
 m[i])
        {
            len 
=
 m[i];
            j 
=
 i;
        }
    res[
0=
 j;
    
int k = 0
;
    
while(j--
)
        
if(len > m[j] && g[j].end <
 g[res[k]].start)
        {
            res[
++k] =
 j;
            len 
=
 m[j];
        }
    
while
(k)
        printf(
"%d ",g[res[k--]].index + 1
);
    printf(
"%d ",g[res[0]].index + 1
);
    free(g);
    free(m);
    free(res);
}
int
 main()
{
#ifndef ONLINE_JUDGE
    freopen(
"1076.txt","r"
,stdin);
#endif

    
int  n;
    
while(scanf("%d",&n) != EOF && n != 0
)
        solve(n);
#ifndef ONLINE_JUDGE
    fclose(stdin);
#endif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值