2018年北邮网研院复试上机题目

2018.网研院.Problem A.商品总价

题目描述
类似超市结账,计算购买的商品的总价格。

输入
第一行为测试数据组数T(0<T<=10)
每组数据第一行为购买商品的种类n,接下来n行,每行两个数据,第一个为商品价格,第二个为商品数量,价格为实型。

输出
每一行输出相对应数据的总价值,保留两位小数。

样例输入

2
2
1.00 **样例输入**

样例输出

3.00
100.00

代码

#include <iostream>

using namespace std;

int main()
{
    int T, N;
    cin >> T;
    while( T-- )
    {
        cin >> N;
        double price;
        int amount;
        double total = 0;
        while( N-- )
        {
            cin >> price >> amount;
            total += price*amount;
        }
        printf("%0.2f\n", total);
    }
    return 0;
}
2018.网研院.Problem B.V字型数列

题目描述
当且仅当三元组i<j<k,且 a[i]>a[j]并且a[k]>a[j],算作一个V型数列。

输入
第一行为测试数据组数T
每组数据第一行为该数组的数字个数(每组数据的个数不超过50)
接下来一行为数组元素

输出
输出对应数组中符合v字形数列的个数

样例输入

2
3
2 1 2
5
2 1 2 1 2

样例输出

1
4

思路
思路一: 每组数据的个数不超过50,那么采用暴力的方法,时间复杂度为503, 远低于百万数量级,所以采用暴力方法不会超时
思路二:V字形序列,对于每个元素,左边元素比当前大,右边元素比当前大。
设置两个数组,分别储存左边更大的元素的个数和右边更大的元素的个数,两数组对应位置想成即得到结果。
求数组时,对于每个元素都需遍历左右两边,所以时间复杂度为O(n2)

代码

#include <iostream>

using namespace std;

const int maxn = 50;
int A[maxn];

int main()
{
    int T;
    cin >> T;
    while( T-- )
    {
        int N;
        cin >> N;
        for( int i = 0; i < N; i++ )
            cin >> A[i];
        int sum = 0;
        for( int i = 0; i < N; i++ )
            for( int j = 1; j < N; j++ )
                for( int k = 2; k < N; k++ )
                {
                    if( i < j && j < k && A[j] < A[i] && A[j] < A[k] )
                        sum++;
                }
        cout << sum << endl;
    }
    return 0;
}
2018.网研院.Problem C.简单的24点

题目描述
输入为4个数字,a,b,c,d。若a^b^c^d=24,则称该数组满足24点,其中^可以为+、-、*、/任一个,若不能得到结果24,则称该数组不满足24点。(计算为实型)

输入
第一行为测试组数t
接下来t行,每一行为四个整数a,b,c,d,测试是否满足24点
1<=a,b,c,d<10000(右区间忘了,反正四个数不为0)

输出
在每一行
若满足,输出YES
不满足,输出NO

思路
此题一看,共64种情况,暴力不会超时。于是,写着写着,嗯。不做了。。。

贪心 | 2018.网研院.Problem D.最大价值

题目描述
对于每一个零件都有一个适宜温度区间,[Ri,Ji],当温度t<Ri,零件价值为x,当t>Ji,零件价值为z;当温度适宜,价值为y。且y>x,y>z。此刻,有一恒温箱,可确定温度t。

输入
第一行按顺序分别为 n,x,y,z。0<n<20000
接下来n行为 每一个零件的适宜温度区间0<Ri<Ji<109

输出
确定一个温度值t,在这温度下所有零件的总价值最大,并输出该价值

样例输入
3 1 3 2
1 4
2 5
7 10

样例输出
7

分析
输入温度时标记每个温度是区间左端点还是区间右端点。
将所有区间端点投射到同一根x轴上,从最左边温度开始逐步向右区间移动。
以最左边区间温度为基准,计算一次总价值,此后,温度变化为其它区间端点时,总价值变化规则如下
1.若下一个温度为左端点,则价值增加值为y-x;
2.若下一个温度为右端点,则价值减少值为y-z;
再次过程中,比较并记录最大的价值。
时间复杂度为O(区间个数)

代码

#include <iostream>
#include <cstdio>

/*记录2n个区间的端点 排序 遍历所有端点 如果是左端点 价值增加 右端点 价值减少*/

using namespace std;
const int maxn = 40040;

struct temperature
{
    int m;      //温度
    int l;      //是否为左区间
}tem[maxn];

bool cmp( temperature a, temperature b )
{
    return a.m < b.m;
}

int main()
{
    int n, x, y ,z;
    int inc, dec;
    while( cin >> n )
    {
        cin >> x >> y >> z;
        inc = y-x;
        dec = y-z;
        int maxv = 0;
        int sum = n * x;
        int num = n*2;  // 2*n 个节点
        for( int i = 0; i < num; i++ )
        {
            cin >> tem[i].m;
            if( !(i%2) )
                tem[i].l = 1;
            else
                tem[i].l = 0;
        }

        sort( tem, tem+num, cmp );
        for( int i = 0; i < num; i++ )
        {
            if( tem[i].l )
                sum += inc;
            else
                sum -= dec;
            if( sum > maxv )
                maxv = sum;
        }
        cout << maxv << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值