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");
}
}
}