由于今晚有点事所以回来都9点多了,看了下题目A了两个水题就不在做下去了
Problem A: Convex
意思就是:
平面上有n个点,每个点到原点的距离是固定的,现在按顺序给出前一个点到后一个点的与原点行成的角度,保证所有角度的和为360度,现在把这些点按顺序连接起来,形成一个多边行,求这个多边行的面积。
画下图就知道是个水题,不过蛋疼了一会。。 sin函数传的参数是弧度,以为是角度,一直没得到想要的结果。。。
角度转弧度: 弧度 = 角度 * PI / 180
解法:把图形分解成n个三角形,求这n个三角形的面积和就行了。 因为知道两边长度加夹角大小,所以直接用三角形公式求面积。。。
1 #include <stdio.h> 2 #include <math.h> 3 #define PI 3.141592653 4 int main(void) 5 { 6 int n; 7 double r; 8 while(scanf("%d%lf",&n,&r)!=EOF) 9 { 10 double ans = 0.0; 11 int a; 12 r = r * r / 2; 13 for(int i = 1; i <= n; i++) 14 { 15 scanf("%d",&a); 16 ans += r * sin(a * PI / 180); 17 } 18 printf("%.3lf\n",ans); 19 } 20 return 0; 21 }
Problem E: The Game about KILL
题目意思:
就是以老师HU和他的学生排成一个圈,然后从1开始报数,报到2的出列,然后下一位又从1开始报数,知道剩下一个人停止,输出这个人的编号。
明显的约瑟夫环问题,这里K是特地的2,由于数据比较大,所以想到应该有规律的
通过约瑟夫环解公式,打印出前100项,立马看出规律来了,下面是约瑟夫环O(n)算法的解法,省去模拟。。
for (i = 2; i <= n; i++)
{
s = (s + k) % i;
}
规律便是:
每逢2的i次幂那个数开始就重新重1开始,接下来的数就是前面的数加上2,即2为1,3就是3了,然后4是2的2次幂,所以4又重新开始为1,则5为3,6为5,7为7,8就是1了,规律就是这样了,接下来代码就简单了
1 //Accepted 904 10 C/Edit 468 B 2 #include <stdio.h> 3 int n; 4 int main() 5 { 6 int f[31]; 7 f[0] = 1; 8 for(int i = 1; i < 31; i++) 9 f[i] = f[i - 1] * 2; 10 while(scanf("%d", &n)!=EOF) 11 { 12 int i; 13 for( i = 0 ;i <= 31; i++) 14 { 15 if(f[i] > n) 16 break; 17 } 18 int d = n - f[i - 1]; 19 printf("%d\n",1 + 2 * d); 20 } 21 return 0; 22 }
其他题没去看。。。有时间再去看下,就写到这了