2017年6月12日 星期一

CPE 023 UVa11063-B2-Sequence


題目原文
題目內容
所謂「B2數列」係指一正整數數列 1<= b1 < b2 < b3 ...,其中所有的 bi + bj (i <= j)皆不相等。
您的任務是判別某一數列是否為「B2數列」。

輸入說明:
每筆測試資料有兩行,第一行代表該數列有 N 個數值(2 ≤ N ≤ 100),第二行則為該數列的N個數值。每個數值 bi 皆為整數,且 bi ≤ 10000。

輸出說明:
每筆測試資料以一行輸出,且每筆輸出資料後均需輸出一空白行。格式請參考輸出範例。

Sample Input

4
1 2 4 8
4
3 7 10 14
5
13 14 15 16 17

Sample Output

Case #1: It is a B2-Sequence.

Case #2: It is not a B2-Sequence.

Case #3: It is not a B2-Sequence.



解法
這題要使用一維矩陣來讀入資料,後面比較麻煩的是要如何判斷它的大小值有無超出範圍和是否有想加出來的值有重複到,然後本篇所使用判斷重複的方法有點類似於使用開櫃子的方法。

(以上資料來源:大學程式能力檢定Collegiate Programming Examination(CPE))




程式碼解答





#include <stdio.h>
#include <string.h>


int main()
{
 int frequence;
 int count=1;
 while(scanf("%d", &frequence)==1)//讀入他的下一筆數列有幾個
 {
  int a[frequence];
  int b2[20002];
  for(int i=0; i<frequence; i++)//讀入數列
  {
   scanf("%d", &a[i]);
  }
  
    memset(b2, 0, sizeof(b2));//把櫃子歸零
  
  int bad=0;//判斷用的變數
  for(int i=0; i<frequence; i++)
  {
   for(int j=i; j<frequence; j++)
   {
   
    int result=d[i]+d[j];
    
 if(d[i]>d[j] || b2[result]!=0)//要比前一個數字大且兩數相加不可重複
 {
    bad=1;
    break;
     
     
 }
   
    
 else  b2[result]++; //如果打開過就把變數值設為1

     
   
   }
  }
  if(bad==0) printf("Case #%d: It is a B2-Sequence.\n\n", count);//如果判斷是零就印第一個
  else printf("Case #%d: It is not a B2-Sequence.\n\n", count);
  count++;//印題號用的
 }
}

程式碼打包:解法一

沒有留言:

張貼留言