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;
}