您当前的位置: 首页 >  算法

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

发布时间:2021-01-10 11:43:29 ,浏览量:6

目录
  • 2035.人见人爱A^B
  • 2036.改革春风吹满地
  • 2037.今年暑假不AC
  • 2038.Message
  • 2039.三角形
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  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  #include  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  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  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语言)

关注
打赏
1688896170
查看更多评论

暂无认证

  • 6浏览

    0关注

    106293博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.3084s