1. 程式人生 > >noip 2005 提高組初賽 訂正

noip 2005 提高組初賽 訂正

文章目錄

選擇題

1.字串“ababacbab”和字串“abcba”的最長公共子串是( )。
A. abcba B. cba C. abc D. ab E. bcba
子串要求連續,子序列可以不連續。
ans = C

6.處理器A每秒處理的指令數是處理器B的2倍。某一特定程式P分別編譯為處理器A和處理器B的指令,編譯結果處理器A的指令數是處理器B的4倍。已知程式P的演算法時間複雜度為O(n2),如果處理器A執行程式P時能在一小時內完成的輸入規模為n,則處理器B執行程式P時能在一小時內完成的輸入規模為( )。
A. 4 * n B. 2 * n C. n D. n / 2 E. n / 4
這題的解決主要在對於變紅的那一句話。這句話翻譯成地球話,即程式P接收了規模為N的資料,處理器A需要處理的指令是B的4倍,已經考慮了P程式的複雜度。所以總體速度B是A的2倍。
ans = B

15、下列外設介面中可以通過無線連線的方式連線裝置的是( )。
A. USB 2.0 高速版 B. 紅外 C. 藍芽 D. 串列埠 E. IEEE 802.11g 無線網絡卡
不要把是看成不是,不要把可以看成不可以就行了。
ans = BCE

20、歷史上第一個高階語言:Fortran

看程式寫結果

#include<iostream>
using namespace std; 
int main() {
      int a, b, c, p, q, r[3];
      cin>>a>>b>>c;
      p = a / b /
c; q = b – c + a + p; r[0] = a * p / q * q; r[1] = r[0] * (r[0]300); if (3 * q – p % 3 <= r[0] && r[2] == r[2]) r[1] = r[r[0] / p % 2]; else r[1] = q % p; cout<<r[0]–r[1]; return 0; } 輸入:100 7 3 輸出:

多膜幾遍也不一定做得對的題目。考試的時候要保留草稿的歷史記錄,然後至少做3遍。
請不要把324/4算成82。
ans = -7452

include<iostream>
using namespace std; 
int main(){
        char str[60];
        int len, i, j, chr[26];
        char mmin = 'z';
        cin>>str;
        len = strlen(str);
        for (i = len - 1; i >= 1; i--)
         if (str[i - 1] < str[i]) break;
        if (i == 0) {
         cout<<"No result!"<<endl;
         return 0;
        }
        for (j = 0; j < i - 1; j++) putchar(str[j]);
        memset(chr, 0, sizeof(chr));
        for (j = i; j < len; j++) {
         if (str[j] > str[i - 1] && str[j] < mmin) 
           mmin = str[j];
         chr[str[j] - 'a']++;
        }
        chr[mmin - 'a']--;
        chr[str[i - 1] - 'a']++;
        putchar(mmin);
        for(i = 0; i < 26; i++)
        for(j = 0; j < chr[i]; j++)
         putchar(i + 'a');
        putchar('\n');
        return 0;
}
輸入:zzyzcccbbbaaa
輸出:                

膜了好幾遍終於檢查出錯誤。
ans = zzzaaabbbcccy

#include <stdio.h>
void digit(long n,long m){
 if(m>0){
   printf("%2ld",n%10);
   if(m>1){
     digit(n/10,m/10);
     printf("%2ld",n%10);
   }
 }
}
int main(){
 long x,x2;
 printf("Input a number:\n");
 scanf("%ld",&x);
 x2=1;
 while(x2<x)
 x2*=10;
 x2/=10;
 digit(x,x2);
 printf("\n");
 return 0;
}

答案不難得出,但是細節非常坑,那個printf(“Input a number:\n”),就算看見了也沒有把他當成輸出。
ans =
Input a number:
’ ‘6’ ‘2’ ‘5’ ‘4’ ‘3’ ‘7’ ‘9’ ‘7’ ‘3’ ‘4’ ‘5’ ‘2’ ‘6(’ '是空格 )

完型

木材加工

  1. 題目描述:
    木材廠有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭(木頭有可能有剩餘),需要得到的小段的數目是給定了的。當然,我們希望得到的小段越長越好,你的任務是計算能夠得到的小段木頭的最大長度。
    木頭長度的單位是cm。原木的長度都是正整數,我們要求切割得到的小段木頭的長度也是正整數。

  2. 輸入:
    第一行是兩個正整數N和K(1 ≤ N ≤ 10000,1 ≤ K ≤ 10000),N是原木的數目,K是需要得到的小段的數目。
    接下來的N行,每行有一個1到10000之間的正整數,表示一根原木的長度。

  3. 輸出:
    輸出能夠切割得到的小段的最大長度。如果連1cm長的小段都切不出來,輸出”0”。

  4. 輸入樣例:
    3 7
    232
    124
    456

  5. 輸出樣例:
    114

  6. 程式:

      include<iostream>
      using namespace std;
      int n, k, len[10000];
      int isok(int t) {
       int num = 0, i;
       for (i = 0; i < n; i++) {
        if (num >= k) break;
        num =;
      }
       if () return 1;
       else return 0;
      }

      int main() {
       int i, left, right, mid;
       cin>>n>>k;
       right = 0;
       for (i = 0; i < n; i++) {
        cin>>len[i];
        if (right < len[i]) right = len[i];
       }
       right++;;
       while (< right) {
        mid = (left + right) / 2;
        if () right = mid;
        else left = mid;
       }
       cout<<left<<endl;
       return 0;
      }

簡單的二分答案,但是他寫的二分比較煩,邊界很可疑。
首先看到right++,還有right = mid,可以看出他的二分割槽間是左閉右開的,即[left, right)。
所以邊界條件是left+1 < right,最終答案是left。
而且應該不難看出如果邊界寫成left < right的話如果出現left = 2,right = 3且2可行的情況程式就會陷入死迴圈,不能把這種情況當做程式寫錯了來看。。。

N叉樹

題目就不放了,只要不拼錯 return 就行了(reutrn

總結

這次考得還不錯,主要是有時間重新做了數學題和寫結果,檢查出了好多錯誤。

考試的時候一定要規劃好草稿紙,要能夠快速找到以前的計算步驟和結果。

然後多膜。