2012年1月6日 星期五

ACM 10107 What is the Median?

這篇作法參考 http://mypaper.pchome.com.tw/iustlovefish/post/1311934438

#include <stdio.h>

int main()
{
  int counter=0;
  int input[10001]={0};
  int a,i,j,temp=0;
      while(scanf("%d",&a)==1)
      {
         for(i=0;i<=counter;i++)
            if(input[i]>a)
              break;
         for(j=counter;j>i;j--)
           input[j]=input[j-1];
          input[j]=a;
          counter++;
      
       if(counter%2==0) printf("%d\n",((input[counter/2]+input[counter/2-1])/2));
       else printf("%d\n",input[counter/2]); 
        /*for(i =0;i<counter;i++)
          printf("data %d\t",input[i]); */
      }
    return 0;     
   system("pause");   
}

2012年1月5日 星期四

ACM 10082 WERTYU

 [心得] :0.004
 1.要注意空白和換行的處理
 2.如果是小寫,則不處理,直接輸出
#include <stdio.h>
#include <string.h>
int main()
{

    char key_board[] = "=-0987654321`\\][POIUYTREWQ';LKJHGFDSA/.,MNBVCXZ";
    char input[3000];
    char map[3000];
    int length1,length2;
    while(gets(input)!=NULL)
    {
      int i,j,counter=0;
      length1 = strlen(input);
      length2 = strlen(key_board);
     
      for(i=0;i<length1;i++)
      { 
           for(j=0;j<length2;j++)
          {  
            if (input[i] == 32)
            {
                   map[i]=32;
                   counter++;

            }  
            else if (input[i] == 13)
            {
                   map[i]=13;   
                    counter++;                
            }
            else if(input[i]==key_board[j])
           {
    
                 map[i]=key_board[j+1];
                  counter++;
           }
    
         }
         if( counter ==0)
           {
                map[i] =  input[i];

           }
           counter=0;
      }
        for(j=0;j<length1;j++)
        {
            printf("%c",map[j]);
        }
        printf("\n");
    }
    system("pause");   
    //return 0;
}


寫完之後看到網路上別人寫的,GOOD!
#include <stdio.h>
#include <string.h>
int main()
{
  char s[50]="=-0987654321`\\][POIUYTREWQ';LKJHGFDSA/.,MNBVCXZ"; 
  char *x;
  char c;
  while((c=getchar())!=EOF)
  {
      x=strchr(s,c);
      putchar(x?s[x-s+1]:c);             
  }
  system("pause");
  return 0;  
}

2012年1月4日 星期三

C acm10071 Back to High School Physics

#include <stdio.h>
#include <stdlib.h>

int v,t,s;

int main()
{
     while(scanf("%d %d",&v,&t)==2)
     {
        s =2*v*t;
        printf("%d\n",s);              
     }  
   
 system("pause");
 //return 0;   
}

C acm 10062 Tell me the frequencies!

 [心得] : //0.012
1.他測資應該有1000個,char array[1001]; 一開始只設1000,一直RE
2.  
     if(first)
       printf("\n");
      first =1;  奇怪的印出空白,這是參考網路上前輩資料

3.要用gets ,用scanf會忽略空白



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
  char array[1001];
  int first=0;

  while(gets(array)!=NULL)
  {
     int number[256]={0};
     int length;
     int i,j;
 
     if(first)
       printf("\n");
      first =1;
     length =strlen(array);                
    
     for(i =0;i<length;i++)
     {
       number[array[i]]++; 
     }
    
      for(i=1;i<=length;i++)
      {            
       for(j=255;j>0;j--)
       {         
         if(number[j]==i)
         {
           printf("%d %d\n",j,i);
         }
       }

     }    
  }
system("pause");
//return 0;
}

acm 10038 Jolly Jumpers

 [心得] : 0.008
測試資料5 -3 1 -2 0 1

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a;
    while(scanf("%d",&a)==1)
    {
       int i;
       int flag =1;
       int array[4000]={0};
       int map[4000]={0};
       int differ;

      for(i =1;i<=a;i++)
        scanf("%d",&array[i]);
              
      for(i=1;i<a;i++)
      {    
           differ = abs(array[i+1]-array[i]);  
             
        if(differ >=a ||differ<1 || map[differ])
        {  
            flag=0;
            printf("Not jolly\n");
            break;
        }
        else
         map[differ] =1;
  
      }
        if(flag)
           printf("Jolly\n");
    }                
 

    return 0;
}

2012年1月2日 星期一

C about -- memset(matrix, 0, sizeof(matrix))

可以用於陣列初始化:
例如: 宣告三個陣列
#define MAXSIZE 8

int map[MAXSIZE+1];
int left[2*MAXSIZE+1];
int right[2*MAXSIZE+1];

 方法一
    memset(map,  0, sizeof(map));
    memset(left, 0, sizeof(left));
    memset(right,0, sizeof(right));

 方法二     
    memset(map,  0, sizeof(int)*(MAXSIZE+1));
    memset(left, 0, sizeof(int)*(2*MAXSIZE+1));
    memset(right,0, sizeof(int)*(2*MAXSIZE+1));

需要注意的是 ,不可以使用memset初始化為1

memset(matrix, 1, sizeof(matrix)); //會失敗
memset(matrix, -1, sizeof(matrix)); //OK
memset(matrix, 0, sizeof(matrix));//OK

memset為字元填入的函式,整數由2或4個位元組(字元)組成
設定的值是0x01,但存入的值卻是0x0101,而導致錯誤的答案
而-1則是0xFF,存入的值是0xFFFF,不會影響答案

#include <stdio.h>

int matrix[5][5];

void init_matrix()
{
  //設定陣列內的值全為-1
  memset(matrix, 1, sizeof(matrix));
}
int main()
{
    int i,j;
    init_matrix();
    for(i=0;i< 5;i++){
       for(j=0;i< 5;i++)
         printf("matrix[%d][%d] =%d\n",i,j,matrix[i][j]);  
    }
    system("pause");