前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PAT准备之2018.7.24

PAT准备之2018.7.24

作者头像
全栈程序员站长
发布2022-07-25 12:46:37
1550
发布2022-07-25 12:46:37
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

昨天被我划水滑过去了,今天终于完成了救赎,基本没有划水,一直在认真的学习,今天也做了不少题,发现自己还是有很多知识点薄弱的地方,还是基础不太好吧,以前总觉得自己这些东西都会,结果发现真到自己用的时候,真的是不会。。。 唉!这个暑假再把基础知识补一补吧。今天也是做了三道题。如下 1007 Maximum Subsequence Sum (25)(25 分) Given a sequence of K integers { N~1~, N~2~, …, N~K~ }. A continuous subsequence is defined to be { N~i~, N~i+1~, …, N~j~ } where 1 <= i <= j <= K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.

Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.

Input Specification:

Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (<= 10000). The second line contains K numbers, separated by a space.

Output Specification:

For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

Sample Input:

10 -10 1 2 3 4 -5 -23 3 7 -21 Sample Output:

10 1 4 求区间最大字段和,很早就做过的题,最开始忘记枚举的怎么搞了。写了一个NlogN的,每次把前缀和放入一个堆中,维护小顶堆,每次取出与其相减,相当于求出到当前位置的最大区间和了,然后不断更新这个值。觉得很对,但是不知道为啥有一个点没过,有点难受。。

然后更改为了标准的解法,其实更加好写了,只要不断记录sum就行了,不过要注意最后的最大区间和可能是0。不能直接单独判断。

代码如下:

代码语言:javascript
复制
#include<bits/stdc++.h>

using namespace std;
const int MAX = 10010;
typedef long long ll;
ll x[MAX];
int N;
int main(void){
    cin >> N;
    for(int i=0;i<N;++i){
        cin >> x[i];
    }
    ll s = 0;
    ll Max = -1;
    int l = 0,r = N-1;
    int index = 0;
    bool isok = false;
    for(int i=0;i<N;++i){
        if(x[i] >= 0){
            isok = true;
        }
        s += x[i];
        if(s < 0){
            s = 0;
            index = i+1;
        }
        else if(s > Max){
            Max = s;
            l = index;
            r = i;
        }
   // cout << "s = " << s << " l = " << l << " r =" << r << " Max= " << Max << endl;
    }
    if(Max < 0){
        cout << 0 << " " << x[0] << " " << x[N-1] << endl;
    }
    else{
        cout << Max << " " << x[l] << " " << x[r] << endl;
    }
    return 0;
}

1008 Elevator (20)(20 分) 大水题一道,没什么好说的。代码也不粘了。

1009 Product of Polynomials (25)(25 分) This time, you are supposed to find A*B where A and B are two polynomials.

Input Specification:

Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N1 a~N1~ N2 a~N2~ … NK a~NK~, where K is the number of nonzero terms in the polynomial, Ni and a~Ni~ (i=1, 2, …, K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10, 0 <= NK < … < N2 < N1 <=1000.

Output Specification:

For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.

Sample Input

2 1 2.4 0 3.2 2 2 1.5 1 0.5 Sample Output

3 3 3.6 2 6.0 1 1.6

两个多项式相乘,也没什么好说的,坑点就是系数为0时要提前计数,不要把它也计算当中。

代码如下:

代码语言:javascript
复制
#include<bits/stdc++.h>

using namespace std;
const int MAX = 110;
const double eps = 1e-6;
class Node{
public:
    int k;
    double v;
};
Node q[MAX],p[MAX];
map<int,double> mp;

int main(void){
    int N,M;
    cin >> N;
    for(int i=1;i<=N;++i){
        cin >> q[i].k >> q[i].v;
    }
    cin >> M;
    for(int i=1;i<=M;++i){
        cin >> p[i].k >> p[i].v;
    }
    for(int i=1;i<=N;++i){
        for(int j=1;j<=M;++j){
            mp[q[i].k+p[j].k] += q[i].v*p[j].v;
        }
    }
    int sum = 0;
    for(map<int,double>::iterator it = mp.begin();it != mp.end();++it){
        if(abs(it->second-0) < eps)
            continue;
        sum++;
    }
    cout << sum;
    for(map<int,double>::reverse_iterator it = mp.rbegin();it != mp.rend();++it){
        if(abs(it->second-0) < eps)
            continue;
        cout << " " << it->first << " ";
        cout << fixed << setprecision(1) << it->second;
    }
    return 0;
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127471.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月9,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档