题目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的指针,再取它的值,定义时先a后b,return 的时候也是先a后b,那么就是升序了
PS 这个函数很有用 qsort(d,n,sizeof(int),cmp);