zoukankan      html  css  js  c++  java
  • 洛谷 P1732 [TJOI2011]序列

    题目描述

    一指数列A={a1, a2, …, an},根据数列A计算数列B={b1, b2, …, bn},其中:

    sumlimits^n_{i=1} b_ii=1nbi

    输入输出格式

    输入格式:

     

    第一行是一个正整数t,表示测试数据的组数。接下来有t行,每行表示一组测试数据。每行以一个正整数n开始,表示数列A中元素的个数;然后是n个非负整数,依次表示a1, a2, …, an的值。

    0<t<=10

    0<n<=100 000

    0<= ai<=65 536

     

    输出格式:

     

    对于每组测试数据,输出数列B的所有的元素之和。

     

    输入输出样例

    输入样例#1: 复制
    2
    5 1 2 3 4 5
    7 2 9 7 4 6 2 6
    
    输出样例#1: 复制
    5
    14
    

     思路:模拟。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int t,n;
    long long ans;
    struct nond{
        int num,pos;
    }v[100010];
    int cmp(nond a,nond b){
        if(a.num==b.num)    return a.pos<b.pos;
        return a.num<b.num;
    }
    int main(){
        scanf("%d",&t);
        while(t--){
            ans=0;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                scanf("%d",&v[i].num),v[i].pos=i;
            sort(v+1,v+1+n,cmp);
            for(int i=1;i<=n;i++){
                if(v[i].pos==1){ ans+=v[i].num;continue; }
                int l=i-1,r=i+1,bns=0x7f7f7f7f;
                while(v[l].pos>v[i].pos)    l--;
                while(v[r].pos>v[i].pos)    r++;
                if(l!=0)    bns=min(bns,v[i].num-v[l].num);
                if(r!=n+1)    bns=min(bns,v[r].num-v[i].num);
                ans+=bns;
            }
            cout<<ans<<endl;
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    MySQL学习笔记:coalesce
    Oracle学习笔记:decode函数
    MySQL学习笔记:like和regexp的区别
    状态图
    构件图和部署图
    java基础知识(一)
    包图
    活动图
    协作图
    序列图
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8000860.html
Copyright © 2011-2022 走看看