• CodeForces1343C


    题意:一道水题,给出一个序列,要求找出一个子序列,(子序列的要求是:满足正负正负、或者负正负正,以此类推),使得该子序列长度最长和值最大。注意看样例(第一个位置无论正负都得取,因为要保证长度最长)。
    PS:但是感觉我这次败给水题了,这题只有800分,我找bug找了2h,加油吧小伙子!

    思路:
    直接根据正负数所在的区间,找出正数区间最大的数和负数区间最大的数,以此类推,进项相加。
    利用两个while进行判断。

    注意:
    一个就是define和const,另外一个就是while的判断条件应该多加一个i<n,而不是在后面i--,否则会导致死循环。

    首先说一下一个很大的问题,就是const和define表示科学计数法的时候,const:可以科学计数法+直接表示数字;define:只能直接写全数字,单独直接科学计数法的话数据会有错,除非加上括号。

    #include <iostream>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    
    #define inf1 1e9+10
    #define inf2 1000000010
    const int i1=1e9+10;
    const int i2=1000000010;
    
    int main()
    {
       cout<<inf1<<endl; // 1e+09
        cout<<inf2<<endl; // 1000000010
       cout<<i1<<endl; // 1000000010
       cout<<i2<<endl; // 1000000010
        return 0;
    }
    

    AC代码:

    #include <iostream>
    #include <string.h>
    #include <algorithm>
    
    using namespace std;
    typedef long long ll;
    
    const int N=2e5+20;
    //#define inf  2147483648
    const ll inf=2147483648;
    //const ll inf=1e9+10;
    ll a[N];
    
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            int n;
            cin>>n;
            int cnt1=0,cnt2=0;
            ll max1=-inf;
            for(int i=0;i<n;i++)
            {
                cin>>a[i];
                if(a[i]<0)
                    cnt1++;
                else
                    cnt2++;
                max1=max(max1,a[i]);
            }
            if(cnt1==n||cnt2==n)
            {
                cout<<max1<<endl;
                continue;
            }
            ll sum=0;
    
    //        int x=n-1;
            for(int i=0;i<n;)
            {
    //            if(i==x)
    //                break;
                bool flag=0;
                max1=-inf;
                while(a[i]>0&&i<n)
                    flag=1,max1=max(max1,a[i]),i++;
    //            cout<<i<<"  1----"<<max1<<endl;
                if(flag)
                    sum+=max1;
                flag=0,max1=-inf;
                while(a[i]<0&&i<n)
                    flag=1,max1=max(max1,a[i]),i++;
    //            cout<<i<<"  2----"<<max1<<endl;
                if(flag)
                    sum+=max1;
            }
            cout<<sum<<endl;
        }
        return 0;
    }
    
    //inf 1061109567
    //int -2147483648~2147483647 老忘:以后写题注意虽然数int,但是进行运算会出现溢出。
    

    这个是官方题解代码,比我的短,自己代码还需改进,毕竟这是水题。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main() {
    #ifdef _DEBUG
    	freopen("input.txt", "r", stdin);
    //	freopen("output.txt", "w", stdout);
    #endif
    	
    	auto sgn = [&](int x) {
    		if (x > 0) return 1;
    		else return -1;
    	};
    
    	int t;
    	cin >> t;
    	while (t--) {
    		int n;
    		cin >> n;
    		vector<int> a(n);
    		for (auto &it : a) cin >> it;
    		long long sum = 0;
    		for (int i = 0; i < n; ++i) {
    			int cur = a[i];
    			int j = i;
    			while (j < n && sgn(a[i]) == sgn(a[j])) {
    				cur = max(cur, a[j]);
    				++j;
    			}
    			sum += cur;
    			i = j - 1;
    		}
    		cout << sum << endl;
    	}
    	return 0;
    }
    ``
  • 相关阅读:
    HTML页面之间跳转传值
    Ajax之三种数据传输格式
    css选择器
    jQuery Validate
    正则表达式
    JSP的九大内置对象,七大动作指令,四个作用域,三个编译指令
    Zooeeper之paxos算法
    ZooKeeper之选举(fastleaderelection算法)
    ZooKeeper之ZAB协议
    ZooKeeper之三阶段提交(3PC)
  • 原文地址:https://www.cnblogs.com/OFSHK/p/13196429.html
Copyright © 2020-2023  润新知