bupt复试机试-----2013

日期

题目描述

请你计算出第年月日是第X年的第几天。其中,1月1日是第一天,1月2日是第二天,以此类推。
计算时请注意闰年的影响。对于非整百年,年数能整除4是闰年,否则不是闰年;对于整百年,年数能整除400是闰年,否则不是闰年。如1900年和1901年不是闰年,而2000年和2004年是闰年。

输入
第一行有一个整数 ,表示一共有T组数据需要你处理。
接下来一共有T行,每行是一个如下格式的字符串:::,表示你需要计算第年月日是第年的第几天。其中是一个大于0,小于2100的整数。保证字符串的格式都是合法的,字符串所表示的日期也都是存在的。
输出
对于每组数据,你需要输出一个整数,表示所求得的结果。
样例输入
2
2013:4:12
112:4:12
样例输出
102
103
来源

2013机考A题

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
bool isrun(int year){
    if(year%400==0||(year%4==0&&year%100!=0)){
        return true;
    }
    else return false;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        int y,m,d;
        scanf("%d:%d:%d",&y,&m,&d);
        int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        if(isrun(y))month[1]=29;
        int sum=0;
        for(int i=0;i<m-1;i++){
            sum+=month[i];
        }
        sum=sum+d;
        cout<<sum<<endl;
    }
    return 0;
}

统计节点个数

题目描述

给出一棵有向树,一共有n个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数。
如样例,第一组的p节点为1,2,3;第二组的p节点为0。

输入
第一行为数据组数T。
每组数据第一行为表示树的节点数。
后面的行,每行两个数,代表节点编号和儿子节点的编号。

输出
每组数据输出一行,为一个整数,代表这棵树上p节点的个数。

样例输入
2
5
0 1
1 2
2 3
3 4
3
0 2
0 1
样例输出
3
1
来源

2013机考B题

#include <iostream>
#include<bits/stdc++.h>
#define N 1000
using namespace std;
struct tree{
    int num;
    int father;
    vector<int>child;
    bool status;
};
void initial(tree t[]){
    for(int i=0;i<N;i++){
        t[i].father=-1;
        t[i].num=0;
        t[i].child.clear();
        t[i].status=false;
    }
}
int main()
{
    int m;
    cin>>m;
    while(m--){
        int n;
        cin>>n;
        tree t[N];
        int no=0;
        initial(t);
        for(int i=1;i<n;i++){
            int a,b;
            cin>>a>>b;
            t[a].status=true;
            t[b].status=true;
            t[b].father=a;
            t[a].child.push_back(b);
            t[b].num++;
        }
        for(int i=0;i<N;i++){
            int flag=1;
            if(t[i].status==true){
                int fa;
                if(t[i].father==-1)fa=0;
                else fa=t[t[i].father].num+t[t[i].father].child.size();
                int sum=t[i].num+t[i].child.size();
                if(sum>=fa){
                    flag=0;
                }
                for(int j=0;j<t[i].child.size();j++){
                    int ch=t[t[i].child[j]].num+t[t[i].child[j]].child.size();
                    if(sum>=ch&&flag==0){
                        flag=0;
                        //cout<<sum<<"-"<<ch<<endl;
                    }else flag=1;
                }
                if(flag==0)no++;
            }
        }
        cout<<no<<endl;
    }
    return 0;
}

中序遍历序列

题目描述
给出一个序列,判断该序列是不是某二叉搜索树的中序遍历序列,如果是输出"Yes",否则输出"No"。
一颗带权二叉树是一颗二叉搜索树(二叉排序树),当且仅当对于任意一个节点,他的左子树中的所有权值小于当前节点的权值,且它的右子树中的所有权值均大于当前节点的权值。

输入
一行代表数据组数。
每组数据包括两行:
第一行为一个整数,表示序列的长度。
第二行包含个整数,表示这个这个序列,序列中的数的范围

输出
每组数据,如果是二叉搜索树的中序遍历序列输出"Yes",否则输出"No"。

样例输入
2
4
1 2 3 4
4
1 3 2 4
样例输出
Yes
No
来源
2013机考C题

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int flag=1;
        int tree[400];
        for(int i=0;i<n;i++){
           cin>>tree[i];
        }
        for(int i=1;i<n;i++){
            if(tree[i]<=tree[i-1]){
                flag=0;
                break;
            }
        }
        if(flag==1)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

最小距离查询

题目描述

给定一个由小写字母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,你需要求出相应的距离。
HINT 由于输入数据较大,C/C++中推荐使用scanf进行读入以获得更快的读入速度。同时请注意算法复杂度。

输入
输入的第一行是一个正整数(),表示测试数据的组数。
每组输入数据的第一行是一个初始串S。第二行是一个正整数(),表示总共操作的数量。接下来m行,每行表示一个操作。操作的格式如上所述。
数据保证在任何情况下,S的长度不会超过100000。
输出
对于每个QUERY,输出所求的最小距离。如果S中其它位置都不存在和它相同的字符,输出-1。

样例输入
2
axb
3
INSERT a
QUERY 0
QUERY 1
explore
3
INSERT r
QUERY 7
QUERY 1
样例输出
3
-1
2
-1
来源

2013机考D题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值