SWITCH

题目描述如下:

There are N lights in a line. Given the states (on/off) of the lights, your task is to determine at least how many lights should be switched (from on to off, or from off to on), in order to make the lights on and off alternatively.
Input
One line for each testcase.
The integer N (1 <= N <= 10000) comes first and is followed by N integers representing the states of the lights ("1" for on and "0" for off).
Process to the end-of-file.
Output
For each testcase output a line consists of only the least times of switches.
Sample Input
3 1 1 1
3 1 0 1
Sample Output
1
0

分析:该题看似简单但却隐藏着陷阱,题目要求寻找的是最少的切换数,故从第二盏灯开始判断处理得出的结论是不一定正确的。通过分析可以发现该题其实只存在两种情况:奇数位置的灯开着或者偶数位置的灯开着。这样可以直观的处理该题:取奇数位置灯开着需要切换灯状态数与偶数位置灯开着需切换灯状态数的较小值。这样的话需要扫描两边灯的状态数组,开销较大。进一步分析,设a为奇数位置的灯开着需要切换的灯数,b为偶数位置灯开着需要切换的灯数。其实a+b=n。这样本题就只需要扫描一遍数组,且进一步优化后存储灯状态的数组也可以省了。具体代码如下:

 

 1#include <stdio.h>
 2#include <stdlib.h>
 3
 4int main(void)
 5{
 6    int n;
 7    int prev;
 8    int tmp;
 9    int cnt;
10    int a;
11    while (scanf("%d"&n) == 1)
12    {
13        prev = -1;
14        cnt = 0;
15        a = n;
16        while (n--)
17        {
18            scanf("%d"&tmp);
19            if (tmp == prev)
20            {
21                if (tmp == 0)
22                {
23                    prev = 1;
24                }

25                else
26                {
27                    prev = 0;
28                }

29                ++cnt;
30                continue;
31            }

32            prev = tmp;
33        }

34        if (cnt > a/2)
35            cnt = a-cnt;
36        printf("%d\n", cnt);
37    }

38    return 0;
39}

posted @ 2010-09-20 09:31 李东亮 阅读(329) | 评论 (0)编辑 收藏

 

The Circumference of the Circle

本题在ZOJ上题号是1090,在POJ上是2242。题目描述如下:

Description

To calculate the circumference of a circle seems to be an easy task - provided you know its diameter. But what if you don't?

You are given the cartesian coordinates of three non-collinear points in the plane.
Your job is to calculate the circumference of the unique circle that intersects all three points.

Input

The input will contain one or more test cases. Each test case consists of one line containing six real numbers x1,y1, x2,y2,x3,y3, representing the coordinates of the three points. The diameter of the circle determined by the three points will never exceed a million. Input is terminated by end of file.

Output

For each test case, print one line containing one real number telling the circumference of the circle determined by the three points. The circumference is to be printed accurately rounded to two decimals. The value of pi is approximately 3.141592653589793.

Sample Input

0.0 -0.5 0.5 0.0 0.0 0.5

0.0 0.0 0.0 1.0 1.0 1.0

5.0 5.0 5.0 7.0 4.0 6.0

0.0 0.0 -1.0 7.0 7.0 7.0

50.0 50.0 50.0 70.0 40.0 60.0

0.0 0.0 10.0 0.0 20.0 1.0

0.0 -500000.0 500000.0 0.0 0.0 500000.0

Sample Output

3.14

4.44

6.28

31.42

62.83

632.24

3141592.65

分析:本题是一道比较容易的题,具体就考察了几个数学公式的使用。本题的关键是求出内接三角形的外接圆直径。而在圆的内接三角形的性质中有这样一条:三角形的任何两边的乘积的等于第三边上的高于其外接圆直径的乘积。这样问题就转化为求接三角形的某一边上的高,在知道三角形三个顶点的情况下,求其面积应该是件容易事,求得面积后,高的问题也就迎刃而解。求面积时,由于本人较懒,用的是海伦公式:S = ,其中p = (a+b+c)/2abc分别为三角形的三个变长,S=0.5*c*h,即可求得ha*b=h*d,那么直径d也就出来了。具体代码如下.

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

int main(void)

{

       double x1, y1, x2, y2, x3, y3;

       double l1, l2, l3;

       double p;

       double h;

       double d;

       while (scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3) == 6)

       {

              l1 = sqrt(pow(x1-x2, 2) + pow(y1-y2, 2));

              l2 = sqrt(pow(x1-x3, 2) + pow(y1-y3, 2));

              l3 = sqrt(pow(x2-x3, 2) + pow(y2-y3, 2));

              p = (l1 + l2 + l3)/2;

              h = sqrt(p*(p-l1)*(p-l2)*(p-l3))*2/l3;

              d = l1*l2/h;

              printf("%.2f\n", 3.141592653589793*d);

       }

       return 0;

}

posted @ 2010-09-19 22:44 李东亮 阅读(1504) | 评论 (0)编辑 收藏

仅列出标题
共2页: 1 2 

posts - 12, comments - 1, trackbacks - 0, articles - 1

Copyright © 李东亮