Friday, January 8, 2010

Power Crisis



During the power crisis in New Zealand this winter (caused by a
shortage of rain and hence low levels in the hydro dams), a
contingency scheme was developed to turn off the power to areas of the
country in a systematic, totally fair, manner. The country was divided
up into N regions (Auckland was region number 1, and Wellington number
13). A number, m, would be picked `at random', and the power would
first be turned off in region 1 (clearly the fairest starting point)
and then in every m'th region after that, wrapping around to 1 after
N, and ignoring regions already turned off. For example, if N = 17 and
m = 5, power would be turned off to the regions in the
order:1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7.



The problem is that it is clearly fairest to turn off Wellington last
(after all, that is where the Electricity headquarters are), so for a
given N, the `random' number m needs to be carefully chosen so that
region 13 is the last region selected.



Write a program that will read in the number of regions and then
determine the smallest number m that will ensure that Wellington
(region 13) can function while the rest of the country is blacked out.


Input and Output



Input will consist of a
series of lines, each line containing the number of regions (N) with
. The file will be terminated by a line consisting of
a single 0.



Output will consist of a series of lines, one for each line of the
input. Each line will consist of the number m according to the above
scheme.


Sample input



17
0


Sample output



7
#include<stdio.h>
#include<conio.h>
int main()
{
        int N,off[100],i,last,count=0,m,inc=0,a,num=0,ans[100];
        clrscr();
        while(scanf("%d",&N))//Taking the number of regions into N.
        {
                      if(N!=0)
                     {
                                 m=1;last=0;
                                 while(last!=13)
                                 {
                                                //Initilaizing the off[] array.
                                                for(i=0;i<N;i++)
                                                {
                                                                off[i]=0;
                                                }
                                                count=0;//Counts the number of regions in which electricity has been switched off.
                                                i=0;
                                                while(count<N)
                                                {
                                                               if(off[i]==0)
                                                               //1 denotes off and 0 denotes not off.
                                                              {off[i]=1;count++;}//Swithing off if not already off.
                                                               last=i+1;//Keeps the last region in which electricity has been switched off.
                                                               inc=0;//Counts the number of times i has been incremented by 1.
                                                               while(inc<m && count<N)
                                                               {
                                                                           if(i>=N-1)
                                                                          {
                                                                                    i=0;
                                                                                   if(off[i]!=1)                                                                            
                                                                                     {inc++;}
                                                                           }
                                                                           /*inc is incremented only while passing through a region with 0 state.*/
                                                                           if(off[i+1]==0)
                                                                           {
                                                                                       i++;
                                                                                       inc++;
                                                                           }
                                                                           else
                                                                           {
                                                                                   i++;
                                                                            }
                                                                }
                                                  }
                                                  m++;
                                    }
                                    ans[num]=m-1;//Storing the values of m in the ans[] array.
                                    num++;
                      }
                      else
                     {
                                   for(i=0;i<num;i++)
                                   {printf("%d\n",ans[i]);}
                                    scanf("%d",&m);
                                    return 0;
                  }
         }
}

17
13
0

7
1

No comments:

Post a Comment