yzoj P2344 斯卡布罗集市 题解

共t条街对于每一条街上有n个店铺(n可能不相同),每次只能选两端第一个营业的店铺采购,采购第i个店铺会获得幸福度ai,采购完后,这个店铺和它相邻的店铺便会关门,问最大幸福度?

考场想了一下dp,一开始想一维但发现不好处理,二维参数也没有想出来,于是便开始了我的暴力瞎搞之旅,我随手写了几个例子发现对于n为奇数无论怎么采购,幸福度是固定的为a1, a3 , a5........an于是便可以直接累加,然而对于n为偶数又怎么去处理呢?我也随手写了n为6,8,10的数据发现其实就只有三种情况。

第一种情况:选编号为奇数的

第二种情况:选编号为偶数的

第三种情况:选两头,再考虑中间,举个栗子

3 8 20 8 15 12 12 25 

对于这组数据我们选完a1 a8后再去进行选择a3 a5我们把选了用o表示没选的用x表示就是

o x o x o x x

貌似一定又两个连在一起的不选,但考场我也没去证明就直接用了,枚举这两个不选的位置就行,跑完样例发现过了便直接提交了,结果a了,自己也很懵逼。

代码

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int t,n;
long long f[310][1510],ans,tmp1,tmp2;
int main(){
    t=read();
    for(int i=1;i<=t;++i){
        n=read();
        for(int j=1;j<=n;++j){
            f[i][j]=read();
        }
        if(n&1){
            for(int j=1;j<=n;++j){
                if(j&1) ans+=f[i][j];
            }
        }
        else{
            tmp2=0;
            for(int j=0;j<=n;++j){
                tmp1=0;
                for(int k=1;k<j;k+=2){
                    tmp1+=f[i][k];
                }
                for(int k=j+2;k<=n;k+=2){
                    tmp1+=f[i][k];
                }
                tmp2=max(tmp1,tmp2);
            }
            ans+=tmp2;
        }
    }
    printf("%lld",ans);
    return 0;
}

貌似可以hack掉,可能数据比较水就a了,再放一个大佬写的前缀和表达

#include<algorithm>
#include<cstdio>
#define ll long long
#define MX 10001
using namespace std;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int T,n;
ll ans=0;
int a[MX];
ll suml[MX],sumr[MX];
int main(){
    T=read();
    while(T--){
        n=read();
        sumr[n+1]=0;
        for(int i=1;i<=n;++i){
            a[i]=read();
            if(i&1){
                suml[i]=suml[i-1]+a[i];
            }else{
                suml[i]=suml[i-1];
            }
        }
        if(n&1){
            ans+=suml[n];
        }else{
            for(int i=n;i>=1;--i){
                if(i&1){
                    sumr[i]=sumr[i+1];
                }else{
                    sumr[i]=sumr[i+1]+a[i];
                }
            }
            ll sum=0;
            for(int i=1;i<=n;++i){
                sum=max(sum,suml[i-1]+sumr[i+1]);
            }
            ans+=sum;
        }
    }
    printf("%lld",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/donkey2603089141/p/11416467.html

时间: 2024-07-31 13:25:26

yzoj P2344 斯卡布罗集市 题解的相关文章

897A. Scarborough Fair# 斯卡布罗集市(模拟)

题目出处:http://codeforces.com/problemset/problem/897/A 题目大意:将某个范围内的某个字符换成另外一个字符 #include<iostream> using namespace std; int main(){ int n,m; cin>>n>>m; string s; cin>>s; while(m--){ int l,r; char in,out; cin>>l>>r>>i

yzoj 2372 小B的数字 题解

题意 判断是否存在一个序列 $ b_i $ 使得 $ \prod_{i = 1}^{n} b_i ?| b_i^{a_i}$ 恒成立,其中 $ b_i $ 中的每个数都是2的正整数次幂. 样例输入 3 2 3 2 3 3 3 3 2 1 10 样例输出 YES YES NO 数据范围 对于 100% 的数据有 $ n \leq 10^5,a_i \leq 10,T \leq 10$ 解析 首先拿到这道题,考场一看就知道不是规律题就是数学公式题,事实上是的. 我们可以设 $ b_i=2^{x_i}

好听的英文歌曲

好听的英文歌曲1.you raise me up2.big big girlproud of you此情可待我心永恒god is a girllet it be崭新世界月亮河阿根廷别为我哭泣失落的爱say you ,say mea time for ussaid i loved you 爱情故事爱的力量此情永不移唯一的爱柠檬树无论多么困难hello远航as long aslove寂静之声斯卡布罗集市always love you无心快语以吻封缄因为我爱你enerything for ulove

让人心情好的音乐

1. 意大利灵魂慢摇DJ 2. Matthew Lien-Bressanone 布列瑟农 3. The Road Not Taken--高珊 4. Scarborough Fair(斯卡布罗集市) 5. エンディング- 世界の約束 ~ 人生のメリーゴーランド 6. 天空之城 7. cool whispers 8. luv letter 版权声明:欢迎转载,转载请注明出处: http://blog.csdn.net/ztf312/

诺贝尔物理学奖

历年得主 编辑 年份 获奖者 国籍 获奖原因 1901年 威廉·康拉德·伦琴 德国 "发现不寻常的射线,之后以他的名字命名"(即X射线,又称伦琴射线,并用伦琴做为辐射量的单位) 1902年 亨得里克·安顿·洛伦兹 荷兰 "关于磁场对辐射现象影响的研究"(即塞曼效应) 彼得·塞曼 荷兰 1903年 安东尼·亨利·贝克勒尔 法国 "发现天然放射性" 皮埃尔·居里 法国 "他们对亨利·贝克勒教授所发现的放射性现象的共同研究" 玛丽·

诺贝尔作品收藏

1.1901年作品<孤独与深思>获诺贝尔文学奖.苏利·普吕多姆(1839-1907)法国诗人. 获奖理由:“是高尚的理想.完美的艺术和罕有的心灵与智慧的实证" 2.1902年作品<罗马风云>获诺贝尔文学奖.特奥多尔·蒙森(1817-1903)德国历史学家. 获奖理由:“今世最伟大的纂史巨匠,此点于其巨著<罗马史>中表露无疑” 3.1903年作品<挑战的手套>获诺贝尔文学奖.比昂斯滕·比昂松(1832-1910)挪威戏剧家.诗人.小说家. 获奖理由:

精进——如何成为很厉害的人(采铜)

前言 今天是大年三十,即将迎来鸡年,希望自己能在新的一年读更多的书,新年更上一层楼,成为一个很厉害的人-<精进——如何成为一个很厉害的人>是本周读完的一本书,祝各位看到这篇文章的朋友新春快乐!鸡年大吉! 干货输出 Day1 导语 “精进”来源佛教,意为“努力向善向上”. 如何对待时间 瑞典心理学家林德沃提出了十条对待时间的建议: (1)生活在当下 (2)严肃地对待时间 (3)留意自己拥有的空间并享受它 (4)反思自己和其他人的时间视角 (5)从现在出发联结过去 (6)并不完全沉浸于过去 (7)

数学故事

发信人: ukim (我没有理想), 信区: Mathematics 标 题: Heroes in My Heart ( 序 ) 发信站: 北大未名站 (2002年04月06日14:23:24 星期六), 转信 --------------------------------- To Music For the Encouragement and Smiles She Gave Me --------------------------------- 序 废话几句. 多年以前,我有一个很宏伟的计

UITableViewCell单元格的删除、插入、移动

UITableViewDelegate的方法 设置编辑模式中得cell的编辑样式(删除或插入) - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath; UITableViewDataSource的方法            设置该单元格能否被编辑 - (BOOL)tableView:(UITableView *