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

总结

这次考得还不错,主要是有时间重新做了数学题和写结果,检查出了好多错误。

考试的时候一定要规划好草稿纸,要能够快速找到以前的计算步骤和结果。

然后多膜。

猜你喜欢

转载自blog.csdn.net/xyyxyyx/article/details/82994652