ACM2037

题目3

Problem Description

统计给定文本文件中汉字的个数。

 

 

Input

输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。

 

 

Output

对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。

[Hint:]从汉字机内码的特点考虑~

 

 

Sample Input

2

WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa!

马上就要期末考试了Are you ready?

 

 

Sample Output

14

9

设计过程:

这道题主要是看汉字的统计方式,找出汉字区别于其他字符的特点,根据ASC码小于0来判断,因为1个汉字占两个字节,所以最后count要除以2

代码:

#include <stdio.h>
#include <string.h>
int main(void) 

int n; 
int count=0; 
while ((c = getchar()) != '\n')

 if (c <0) count++; 
printf("%d\n", count / 2); 
return 0;
}

 

 

题目4

Problem Description

“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”

确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)

 

 

Input

输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。

 

 

Output

对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。

 

 

Sample Input

12

1 3

3 4

0 7

3 8

15 19

15 20

10 15

8 18

6 12

5 10

4 14

2 9

0

 

 

Sample Output

5

 

 

设计思路

先把这一串数组进行排序,随后由末尾往上走,前安排时间靠后的,然后把这一时间点的开始时间,和上一个节目的结束时间相比较,如果接的上,那么就安排上一个节目。当然也可以是安排上上个节目,这就要用到循环。用max来储存最多的节目。

所以设计了结构数组,通过结构体,使得整个时间表更加直观。

 

其中用到了qsort函数

intcompare(const void *a , const void*b )

 

{

 

  return *(int *)a - *(int*)b;  //升序排序

 

//return *(int *)b - *(int *)a; //降序排序

 

/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。

 

       升序排列时,若第一个参数指针指向的“值”大于第二个参数指针指向的“值”,则返回正;

       若第一个参数指针指向的“值”等于第二个参数指针指向的“值”,则返回零;

       若第一个参数指针指向的“值”小于第二个参数指针指向的“值”,则返回负。

 

        降序排列时,则刚好相反。

*/

}

 

int cmp(const struct c *a, const struct c*b)

 {   

          if ((*a).x == (*b).x) 

          {return (*a).y - (*b).y;}

    else      

          {return (*a).x - (*b).x;}

}

指的是x相等时,按y升序排

 

摘录

七种qsort排序方法 

<本文中排序都是采用的从小到大排序> 

一、对int类型数组排序 

int num[100]; 

Sample: 

int cmp ( const void *a , const void *b ) 
{ 
return *(int *)a - *(int *)b; 
} 

qsort(num,100,sizeof(num[0]),cmp); 

二、对char类型数组排序(同int类型) 

char word[100]; 

Sample: 

int cmp( const void *a , const void *b ) 
{ 
return *(char *)a - *(int *)b; 
} 

qsort(word,100,sizeof(word[0]),cmp); 

三、对double类型数组排序(特别要注意) 

double in[100]; 

int cmp( const void *a , const void *b ) 
{ 
return *(double *)a > *(double *)b ? 1 : -1; 
} 

qsort(in,100,sizeof(in[0]),cmp) 

四、对结构体一级排序 

struct In 
{ 
double data; 
int other; 
}s[100] 

//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写 

int cmp( const void *a ,const void *b) 
{ 
return (*(In *)a).data > (*(In *)b).data ? 1 : -1; 
} 

qsort(s,100,sizeof(s[0]),cmp); 

五、对结构体二级排序 

struct In 
{ 
int x; 
int y; 
}s[100]; 

//按照x从小到大排序,当x相等时按照y从大到小排序 

int cmp( const void *a , const void *b ) 
{ 
struct In *c = (In *)a; 
struct In *d = (In *)b; 
if(c->x != d->x) return c->x - d->x; 
else return d->y - c->y; 
} 

qsort(s,100,sizeof(s[0]),cmp); 

六、对字符串进行排序 

struct In 
{ 
int data; 
char str[100]; 
}s[100]; 

//按照结构体中字符串str的字典顺序排序 

int cmp ( const void *a , const void *b ) 
{ 
return strcmp( (*(In *)a)->str , (*(In *)b)->str ); 
} 

qsort(s,100,sizeof(s[0]),cmp); 

七、计算几何中求凸包的cmp 

int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序 
{ 
struct point *c=(point *)a; 
struct point *d=(point *)b; 
if( calc(*c,*d,p[1]) < 0) return 1; 
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面 
return 1; 
else return -1; 
} 

PS: 

其中的qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里

 

 

代码

#include <stdio.h>

#include <stdlib.h>

 struct c

 {     

          int x;   //             起

          int y;    //      终

          int sum;   //总节目数

 }d[100];

 intcmp(const struct c *a, const struct c *b)

 {   

          if ((*a).x == (*b).x) 

          {return (*a).y - (*b).y;}

    else      

          {return (*a).x - (*b).x;}

 intmain(void)

 {   

          int i,j,n,max; 

          while(scanf("%d",&n),n)  

          {      

                    for(max=i=0;i<n;i++) 

                    {           

                             scanf("%d%d",&d[i].x,&d[i].y);  

                             d[i].sum=1;                  //初始化,节目最少为1    

                    }       

                    qsort(d,n,sizeof(struct c),cmp); //把d[n]排序

                    d[n-1].sum = 1;   

                    for(i=n-2;i>=0;i--)   

                    {          

                             for(j=i+1;j<n;j++)  

                             {             

                                      if(d[i].y<=d[j].x&&d[i].sum<d[j].sum+1){d[i].sum=d[j].sum+1;}      

                             }             

                             if(max<d[i].sum){max = d[i].sum;}  

                    }      

                    printf("%d\n",max); 

          }

          return 0;

 }

 

 

这道题最最重要的是学习qsort函数,即qsort(d,n,sizeof(struct c),cmp);

需要自己写一个cmp函数。

一般的:

int num[100];

Sample:

int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}

其中*(int*)a的意思是把a换成int的指针,再取它的值,定义时先abreturn 的时候也是先ab,那么就是升序了

PS  这个函数很有用 qsort(d,n,sizeof(int),cmp);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值