1. 程式人生 > >2013北郵計算機院上機題

2013北郵計算機院上機題

A 日期
Description
請你計算出第X年Y月Z日是第X年的第幾天。其中,1月1日是第一天,1月2日是第二天,以此類推。
計算時請注意閏年的影響。對於非整百年,年數能整除4是閏年,否則不是閏年;對於整百年,年數能整除400是閏年,否則不是閏年。如1900年和1901年不是閏年,而2000年和2004年是閏年。
InputFormat
第一行有一個整數T(T <= 100),表示一共有T組資料需要你處理。
接下來一共有T行,每行是一個如下格式的字串:X:Y:Z,表示你需要計算第X年Y月Z日是第X年的第幾天。其中X是一個大於0,小於2100的整數。保證字串的格式都是合法的,字串所表示的日期也都是存在的。
OutputFormat
對於每組資料,你需要輸出一個整數,表示所求得的結果。
SampleInput
2
2013:4:12
112:4:12
SampleOutput
102
103
  思路:王道機試指南上的模板題。

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

#define ISLEAPYEAR(x) x % 100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1 : 0

int dayOfMonth[13][2] = {
    0,0,
    31,31,
    28,29,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31,
    31,31,
    30,30,
    31,31,
    30,30,
    31
,31 }; struct Date { int year; int month; int day; void nextDay() { day++; if(day > dayOfMonth[month][ISLEAPYEAR(year)]) { day = 1; month++; if(month > 12) { month = 1; year++; } } } }; int
buf[5001][13][32]; int main() { Date temp; temp.year = 0; temp.month = 1; temp.day = 1; int count = 0; while(temp.year <= 5000) { buf[temp.year][temp.month][temp.day] = count; temp.nextDay(); count++; } int y1,m1,d1,y2,m2,d2; int T; scanf("%d",&T); while(T--) { scanf("%d:%d:%d",&y1,&m1,&d1); printf("%d\n",buf[y1][m1][d1] - buf[y1][1][1] + 1); } }

B 統計節點個數
Description
給出一棵有向樹,一共有N (1< N ≤ 1000 )個節點,如果一個節點的度(入度+出度)不小於它所有兒子以及它父親的度(如果存在父親或兒子),那麼我們稱這個節點為p節點,現在你的任務是統計p節點的個數。
InputFormat
第一行為資料組數T (1≤T≤100 )。
每組資料第一行為N 表示樹的節點數。後面為N−1 行,每行兩個數x ,y (0 ≤ x,y < N),代表y是x的兒子節點。
OutputFormat
每組資料輸出一行,為一個整數,代表這棵樹上p節點的個數。
SampleInput
2
5
0 1
1 2
2 3
3 4
3
0 2
0 1
SampleOutput
3
1
Hint
第一組的p節點為1,2,3;第二組的p節點為0。
  思路:樹就是圖嘛,先把圖中每個節點的度算出來,然後和它的鄰接節點比較就可以了。

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

using namespace std;

int main() {
    int T;
    scanf("%d",&T);
    vector<int> a[1000];
    int b[1000];
    while(T--) {       
        int N;
        scanf("%d",&N);
        for(int i = 0;i < N;i++) {
            a[i].clear();
        }
        memset(b,0,sizeof(b));
        int x,y;
        for(int i = 0;i < N - 1;i++) {
            scanf("%d%d",&x,&y);
            a[x].push_back(y);
            a[y].push_back(x);
            b[x]++;
            b[y]++;
        }
        int num = 0;
        bool flag;
        for(int i = 0;i < N;i++) {
            flag = true;
            for(int j = 0;j < a[i].size();j++) {
                if(b[i] < b[a[i][j]]) {
                    flag = false;
                    break;
                }
            }
            if(flag) {
                num++;
            }
        }
        printf("%d\n",num);
    }
}

C 中序遍歷序列

Description

給出一個序列,判斷該序列是不是某二叉搜尋樹的中序遍歷序列,如果是輸出”Yes”,否則輸出”No”。

一顆帶權二叉樹是一顆二叉搜尋樹(二叉排序樹),當且僅當對於任意一個節點,他的左子樹中的所有權值小於當前節點的權值,且它的右子樹中的所有權值均大於當前節點的權值。

Input Format

第一行T (T<=10 )代表資料組數。

每組資料包括兩行:

第一行為一個整數N (1<=N<=400),表示序列的長度。

第二行包含N 個整數,表示這個這個序列,序列中的數的x 範圍為(1<=x<=100000)。

OutPut Format

每組資料,如果是二叉搜尋樹的中序遍歷序列輸出”Yes”,否則輸出”No”。

Input
2
4
1 2 3 4
4
1 3 2 4

OutPut
Yes
No
  思路:這題放在C題感覺好水啊,只要判斷一個序列是不是嚴格遞增的就行了。。。

#include<stdio.h>

int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
        int N;
        scanf("%d",&N);
        int x,y;
        N--;
        scanf("%d",&x);
        y = x;
        bool flag = false;
        while(N--) {
            scanf("%d",&x);
            if(!flag && y >= x) {
                flag = true;               
            }
            y = x;
        }
        if(flag) {
            printf("No\n");
        } else {
            printf("Yes\n");
        }
    }
}

D 最小距離查詢

Description

給定一個由小寫字母a到z組成的字串S,其中第i個字元為S[i](下標從0開始)。你需要完成下面兩個操作:

INSERT c

其中c是一個待輸入的字元。你需要在字串的末尾新增這個字元。保證輸入的字元同樣是a到z之間的一個小寫字母。

QUERY x

其中x是一個輸入的整數下標。對於這個詢問,你需要回答在S當中和S[x]相等且與x最近的距離。輸入保證x在當前字串中合法。

例如S = “abcaba”,如果我們操作:
INSERT a

則在S的末端加一個字元a,S變成”abcabaa”。

接下來操作
QUERY 0

由於S[0] = a,在S中出現的離他最近的a在下標為3的位置上,距離為3 - 0 = 3。因此應當輸出3。

接下來,如果
QUERY 4

S[4] = b,S中離它最近的b出現在下標為1處,距離為4 - 1 = 3。同樣應當輸出3。

給定初始字串S和若干操作,對於每個QUERY,你需要求出相應的距離。

InputFormat

輸入的第一行是一個正整數T (T≤20 ),表示測試資料的組數。

每組輸入資料的第一行是一個初始串S。第二行是一個正整數m (1≤m≤100000 ),表示總共操作的數量。接下來m行,每行表示一個操作。操作的格式如上所述。

資料保證在任何情況下,S的長度不會超過100000。

OutputFormat

對於每個QUERY,輸出所求的最小距離。如果S中其它位置都不存在和它相同的字元,輸出-1。

SampleInput
2
axb
3
INSERT a
QUERY 0
QUERY 1
explore
3
INSERT r
QUERY 7
QUERY 1

SampleOutput
3
-1
2
-1

Hint

由於輸入資料較大,C/C++中推薦使用scanf進行讀入以獲得更快的讀入速度。同時請注意演算法複雜度。

  思路:以後有時間再做吧。。。