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