杭电OJ第11页2035~2039算法题(C语言)

2035.人见人爱A^B

Problem Description
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
Input
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果
A=0, B=0,则表示输入数据的结束,不做处理。
Output
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
Sample Input
2 3
12 6
6789 10000
0 0
Sample Output
8
984
1

分析:计算AB时,可以使用for循环,在每循环一次时,可以直接将中间结果对1000取余,最后循环结束后得到的结果即为所求结果。

#include <stdio.h>

void AB(){
	int n,m,i,res;
	while(scanf("%d%d",&n,&m)!=EOF){
		if(n==0 && m==0){
			break;
		}
		if(n<0 || m<0 || n>10000 || m>10000){
			printf("输入的值的取值范围为[0,10000]之间的整数!\n"); 
			continue;
		}
		res=1;
		for(i=1;i<=m;i++){
			res*=n;
			res%=1000;
		}
		printf("%d\n",res);
	}
}

2036.改革春风吹满地

Problem Description
“ 改革春风吹满地,
不会AC没关系;
实在不行回老家,
还有一亩三分地。
谢谢!(乐队奏乐)”

话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然
来这么几句打油诗。
好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块。
这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是linle 的,现在就
准备送给你了。不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多少面积,如果回
答正确才能真正得到这块地。
发愁了吧?就是要让你知道,种地也是需要AC知识的!以后还是好好练吧...
Input
输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示
多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, 
y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
Output
对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
每个实例的输出占一行。
Sample Input
3 0 0 1 0 0 1
4 1 0 0 1 -1 0 0 -1
0
Sample Output
0.5
2.0

分析:注意到题目中给了这样的一个提示:“按照逆时针顺序给出的n个顶点的坐标”,此时可以考虑以输入的第一顶点为出发点,向与其不相邻的n-3个顶点连接n-3条线段,最终可将该多边形划分为n-2个三角形,然后利用向量的叉乘来求每个三角形的面积,最后相加即可。下图中给了一个五边形的例子:
在这里插入图片描述

#include <stdio.h>
#include <math.h>

void Area(){
	//(x[i],y[i])表示第i个顶点的坐标 
	int x[100],y[100];
	//n表示边数(同时也表示顶点个数) 
	int n,i,x1,x2,y1,y2;
	double res;
	while(scanf("%d",&n)!=EOF) {
		if(n==0){
			break;
		}
		if(n<3 || n>100){
			printf("顶点个数n的取值范围为[3,100]之间的整数!\n");
			continue;
		}
		//将顶点坐标存入数组x和数组y中 
		for(i=0;i<n;i++){
			scanf("%d%d",&x[i],&y[i]);
		}
		res=0;
		//对于向量A=(x1,y1)、向量B=(x2,y2),向量A和向量B叉乘的模的绝对值表示以A和B为两边所形成的平行四边形的面积
		for(i=1;i<n-1;i++){
			x1=x[i]-x[0];
			y1=y[i]-y[0];
			x2=x[i+1]-x[0];
			y2=y[i+1]-y[0];
			res+=(double)fabs((x1*y2-x2*y1))/2;
		}
		printf("%.1lf\n",res);
	}	
}

2037.今年暑假不AC

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

分析:使用贪心算法可以较为快速地求解此题,其基本思路如下:
(1)按照每个节目的结束时间从小到大进行排序。又由于一个节目同时用拥有开始时间和结束时间,所以可以使用C语言中的结构体来表示每一个节目,其成员包括,每一个节目的开始时间和结束时间。这样在进行排序时较为方便(下面的代码中使用的是简单交换排序,当然也可以使用其他的排序算法)。
(2)以排序后的第一个节目(即结束时间最早的节目)的结束时间tf为基准,后面的每一个节目的开始时间programs[i].start与tf进行比较,若programs[i].start>=tf,则说明第一个节目结束时,节目programs[i]刚开始或者马上开始,此时可以转向该节目,所以能完整看到的电视节目的个数加一,即count++,并且将该节目的结束时间赋值给tf,方便下一次比较。

#include <stdio.h>

struct program{
	int start;		//开始时间 
	int finish;		//结束时间 
};

void NoAC(){
	int n,i,j,count,tf;
	struct program programs[100],temp; 
	while(scanf("%d",&n)!=EOF && n){
		if(n<0 || n>100){
			printf("节目总数的取值范围为[0,100]之间的整数!\n");
			continue;
		}
		count=1;
		for(i=0;i<n;i++){
			scanf("%d%d",&programs[i].start,&programs[i].finish);
		}
		//使用简单交换排序,按照每个节目的结束时间从小到大进行排序
		for(i=0;i<n-1;i++){
			for(j=i+1;j<n;j++){
				if(programs[i].finish>programs[j].finish){
					temp=programs[j];
					programs[j]=programs[i];
					programs[i]=temp;
				}
			}
		}
		tf=programs[0].finish;
		for(i=1;i<n;i++){
			if(programs[i].start>=tf){
				count++;
				tf=programs[i].finish;
			}
		}
		printf("%d\n",count);
	}
}

2038.Message

无此题目System Message

2039.三角形

Problem Description
给定三条边,请你判断一下能不能组成一个三角形。
Input
输入数据第一行包含一个数M,接下有M行,每行一个实例,包含三个正数A,B,C。其中A,B,C <1000;
Output
对于每个测试实例,如果三条边长A,B,C能组成三角形的话,输出YES,否则NO。
Sample Input
2
1 2 3
2 2 2
Sample Output
NO
YES

分析:三角形的一个重要性质是任意两条边长之和一定大于另一条边(或者任意两条边长之差一定小于另一条边),利用这一性质即可以判断三条边长A,B,C能否组成三角形。

#include <stdio.h>

void IsTriangle(){
	int n;
	double a,b,c;
	scanf("%d",&n);
	while(n--){
		scanf("%lf%lf%lf",&a,&b,&c);
		if(a<=0 || b<=0 || c<=0){
			printf("三角形的三条边都为正数!\n");
			continue;
		}
		if(a+b>c && a+c>b && b+c>a){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
}

杭电OJ第11页2040~2044算法题(C语言)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值