2018zoj省赛(太菜了,写dp的人怎么都A不了dp题_zoj wall gameacm省赛-程序员宅基地

技术标签: zoj  省赛  acm  浙江  dp  数据结构  

M、A、B、L签到不说。
题目链接:
2018浙江acm省赛

D Sequence Swapping(据说经典模型,做了a才能去做b求最大价值的dp模型

题意:开始的时候读错题意了(我真的是太菜了,学这么多dp,可是都不熟练,啥题都A不掉,菜啊。给一个仅由’(‘与’)’组成的字符串,只有()相连的时候才可以对调位置,每个符号都有其价值,每次移动价值为a[i]*a[i+1],问可以获得的最大价值。
思路:因为第i个括号能获得的最大价值受到第i+1个括号向右移动多少的影响,那么可以得到对于i+1移到右边不同的距离,其第i个移动到一个位置获得的价值有很多种,这里取i+1移动到比i能移动的更右边的最大价值即可。
dp[i][j]表示第i个’字符移到j位置可以获得的最大价值。
那么转移可以为dp[i][j]=dp[i][j]+max(dp[i+1][k]) j

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory>
#include <queue>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
const ll maxn=1e3+7;
const ll mod = 1e9;
char s1[maxn];
ll dp[maxn][maxn];
ll qq[maxn];
int main()
{
    //e满足Note里提到的合法运算式
    //freopen("in.txt","r",stdin);
    //freopen("out1.txt","w",stdout);
    ll i,j;
    //ios::sync_with_stdio(false);
    ll T,k,t2,t3,t4,f1,f2,f3,f4;
    ll r,c;
    ll  n,m,K;
    cin >> T;
    ll res;
    while(T--){
    cin >> n;
    cin >> s1;
    memset(dp,0,sizeof(dp));
    ll len1=strlen(s1);
    qq[len1]=qq[len1+1]=0;
    for(i=0;i<len1;i++){
    scanf("%lld",&qq[i]);
    }
    for(i=0;i<len1;i++){
        if(s1[i]=='('){
           res=0;
           for(j=i+1;j<len1;j++){
                if(s1[j]==')')res+=qq[i]*qq[j];
           dp[i][j]=res;
            }
        }
    }
    for(i=len1-1;i>=0;i--){
        res=-1e9;
        for(j=len1-1;j>=i;j--){
        res=max(res,dp[i+1][j]);
        dp[i][j]=dp[i][j]+res;
        }
    }
    ll Max=0;
    for(i=0;i<len1;i++){
    Max=max(Max,dp[0][i]);
    }
    cout << Max << endl;
    }
    return 0;
}

J CONTINUE…?

题意:有n个人,给一个长度为n的01序列,1表示第i个人为男生,0表示第i个人为女生,第i个人拥有价值i的物品,问如何对他们进行分组,使得G1+G3=G2+G4,G1与G2中全为女生,G3与G4中全为男生,如果有分组情况输出分组情况,如果没有直接输出-1。
思路:显然得到一个结论,总价值不为偶数的直接无法满足,那么显然n%4=3或者n%4=0才可以使得结果满足。刚开始相当于把所以女生放在1,把所有男生放在4,问从中拿出哪些男生女生可以使得结果的和为n/2,因为价值是1,2,3,4,。。。n-1,n。那么可以得到如果n%4==0,那么其可以分成n/4对1+n与2+n-1大小的数对,那么只需要把前面的n/4个人与后面的n/4个人分到2与3即可。
如果n%4==3,则相当与把1与(n+1)/2放在左,而(n+1)/2+1放在右。然后剩余的结果又可以%4得到均分。
wa1:超时,memset循环对大数组赋值
源码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <set>
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
struct ttt{
    string s1;
    ll score;
};
ttt q1[maxn];
char s1[maxn];
char s2[maxn];
int main()
{
    //e满足Note里提到的合法运算式
    //freopen("in.txt","r",stdin);
    //freopen("out1.txt","w",stdout);
    int i,j;
    int T,k,t1,t2,t3,t4,f1,f2,f3,f4;
    int r,c;
    ll n,m,K;
    t1=0;
    cin >> T;
    while(T--){
    cin >> n;
    cin >> s1;
    if(n%4==1||n%4==2){
        cout << "-1" << endl;continue;
    }
    memset(s2,0,sizeof(s2));
    if(n%4==0){
    t2=n/4;
    for(i=0;i<n;i++){
    j=i+1;
    if(j<=t2||n-i<=t2){
    if(s1[i]=='0')
    s2[i]='1';
    else
    s2[i]='3';
    }else{
    if(s1[i]=='0')
    s2[i]='2';
    else
    s2[i]='4';
    }
    }
    }else{
    t2=(n-3)/4+1;
    t3=(n+1)/2;
    for(i=0;i<n;i++){
    j=i+1;
    if(j<=t2||j==t3||n-i<t2){
    if(s1[i]=='0')
    s2[i]='1';
    else
    s2[i]='3';
    }else{
    if(s1[i]=='0')
    s2[i]='2';
    else
    s2[i]='4';
    }
    }

    }
    cout << s2<< endl;
    }
    return 0;
}

F:Now Loading!!!

题意:

给一个序列的数字a1、a2、a3、a4、a5,然后给n组查询p,问每次p的结果。
思路:由公式可知,只有a[i]改变成p的指数的时候,对应其的b[i](这里b[i]指一个公式对应的一个值。
可以先将p排序从大到小,那么此时是那么可以枚举a的n次方根时候的新a[i],如果比p大,那么就更新a的结果,然后改变总结果sum即可。这里更新的方法是,枚举a的n次方根,按大到小排序丢入队列,然后丢进去的时候要记录这个a[i]值为第几次方根即可,对于每个p把大于其的全部更新,然后就得出了这个p的对应这个函数的值。
wa1:取mod问题,是对1e9取模,而不是1e9+7,有点想当然了。
wa2:还是取mod问题,不可以ans+=..%mod这样取模
源码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory>
#include <queue>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <set>
using namespace std;
const int maxn=5e5+7;
typedef long long ll;
const ll mod = 1e9;
ll q1[maxn];
ll q2[maxn];
struct ttt{
    ll pos,num;
    double key;
    bool operator < (const ttt &b)const{
        return key<b.key;
    }
};
struct tt1{
    ll key;
    ll id;
};
tt1 p[maxn];
ll res[maxn];
int cmp1(tt1 x,tt1 y){ //从大开始慢慢递减
    return x.key>y.key;
}
int main()
{
    //e满足Note里提到的合法运算式
    //freopen("in.txt","r",stdin);
    //freopen("out1.txt","w",stdout);
    ll i,j;
    ll T,k,t2,t3,t4,f1,f2,f3,f4;
    ll r,c;
    ll n,m,K;
    double t1;
    double g1,g2,g3,g4,g5;
    cin >> T;
    ll Sum;
    ll Res;
    while(T--){
    cin >> n >> m;
    Sum=0;
    ttt u;
    priority_queue<ttt>G;
    for(i=1;i<=n;i++){
    scanf("%lld",&q1[i]);
    res[i]=1;
    Sum+=q1[i];
    u.key=q1[i];
    u.num=1;
    u.pos=i;
    G.push(u);
    }
    Res=0;
    ll Minp=2e9+7;
    for(i=1;i<=m;i++){
    scanf("%lld",&p[i].key);
    p[i].id=i;

    Minp=min(Minp,p[i].key);
    }
    sort(p+1,p+1+m,cmp1);
    for(i=1;i<=n;i++){
        t1=q1[i];
        u.pos=i;
        for(j=2;j<=35;j++){
            g1=j;
            g2=pow(t1,1.0/g1); //次方根
            if(g2<Minp)break;
            u.key=g2; //key=t1 +1
            u.num=j;
            G.push(u);
        }
    }
    ll gg;
    for(i=1;i<=m;i++){
    while(!G.empty()){
        u=G.top();
        if(u.key>p[i].key){
        gg=floor(q1[u.pos]/res[u.pos]);
        Sum-=gg;
        res[u.pos]=u.num+1;
        gg=floor(q1[u.pos]/res[u.pos]);
        Sum+=gg;
        G.pop();
        }else{
        break;
        }
    }
    Res=(Res+(p[i].id*(Sum%mod))%mod)%mod;
    }
    cout << Res << endl;

    }
    return 0;
}

k:Mahjong Sorting

题意:(题意水题,间接说明了English is important。
给3*m个麻将,玩家将会在这3*m个麻将中选取一个幸运麻将(幸运麻将排在最前面。给n个已经排了序的麻将,问这3*m个麻将中有哪些可能成为幸运的麻将。这里有个门这个麻将,其存在给出的n个麻将中的意义是表明在排序之前,幸运麻将所在的位置。
思路:因为题目给出了排序的方式,那么可以将每个麻将最初的顺序转换为数字的形式去表达。
那么B就是M+Rank,D就是M+M+Rank。那么每个麻将均有一个其排名的数字了,如果第一个数字不是这些数字中最小的,那么说明lucky麻将被选出来了,结果只有一个。如果没被选出来,而结果中没有门这个麻将,那么说明除了这n个以为,所有麻将都有可能被排在第一,当然选出了的第1个也可能,但是选出了的另外n-1个均不可能为lucky麻将。如果有门,那么门左右区间的都可能是lucky麻将,并且如果门前面有且仅一个数字,其也可能是lucky麻将(这里可以参考题目给出的样例
源码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory>
#include <queue>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <set>
using namespace std;
const int maxn=2e5+7;
typedef long long ll;
const ll mod = 1e9;
int qq[maxn];
char s1[15];
int main()
{
    //e满足Note里提到的合法运算式
    //freopen("in.txt","r",stdin);
    //freopen("out1.txt","w",stdout);
    ll i,j;
    ll T,k,t2,t3,t4,f1,f2,f3,f4;
    ll r,c;
    ll n,m,K;
    double t1;
    double g1,g2,g3,g4,g5;
    cin >> T;
    ll Sum;
    ll Res;
    while(T--){
    cin >> n >> m;
    int pos=0;
    int min1=1e9;
    //memset(qq,0,sizeof(qq));
    for(i=1;i<=n;i++){
    cin >> s1 ;
  //  cout << s1<< endl;
    if(s1[0]=='C'){
    qq[i]=0;

    }else if(s1[0]=='B'){
    qq[i]=m;

    }else if(s1[0]=='D'){
    qq[i]=m+m;

    }else if(s1[0]=='W'){
    pos=i;continue;
    }
    cin >> t2;
    qq[i]+=t2;
    min1=min(min1,qq[i]);
    }

    if(pos==1&&n!=1){
    cout << qq[2] << endl;continue;
    }else if(pos==1){
    cout << m << endl;continue;
    }

    if(min1!=qq[1]){
    cout <<"1"<<endl;continue;
    }
    //cout <<"~666 " << endl;
    if(pos==n){
    cout << 3*m-qq[n-1]+1 << endl;continue;
    }
    t1=0;
    if(pos==2)
    t1=1;
    if(pos==0){
    cout << 3*m-n+1 << endl;continue;
    }else{   //门在中间
    cout << qq[pos+1]-qq[pos-1]+t1-1 << endl;continue;
    }

    }
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_36124802/article/details/80158910

智能推荐

JavaScript学习笔记_curry函数未定义-程序员宅基地

文章浏览阅读343次。五种原始的变量类型1.Undefined--未定义类型 例:var v;2.String -- ' '或" "3.Boolean4.Number5.Null--空类型 例: var v=null;Number中:NaN -- not a number非数本身是一个数字,但是它和任何数字都不相等,代表非数,它和自己都不相等判断是不是NaN不能用=_curry函数未定义

兑换码编码方案实践_优惠券编码规则-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏17次。兑换码编码设计当前各个业务系统,只要涉及到产品销售,就离不开大大小小的运营活动需求,其中最普遍的就是兑换码需求,无论是线下活动或者是线上活动,都能起到良好的宣传效果。兑换码:由一系列字符组成,每一个兑换码对应系统中的一组信息,可以是优惠信息(优惠券),也可以是相关奖品信息。在实际的运营活动中,要求兑换码是唯一的,每一个兑换码对应一个优惠信息,而且需求量往往比较大(实际上的需求只有预期_优惠券编码规则

c语言周林答案,C语言程序设计实训教程教学课件作者周林ch04结构化程序设计课件.ppt...-程序员宅基地

文章浏览阅读45次。C语言程序设计实训教程教学课件作者周林ch04结构化程序设计课件.ppt* * 4.1 选择结构程序设计 4.2 循环结构程序设计 4.3 辅助控制语句 第四章 结构化程序设计 4.1 选择结构程序设计 在现实生活中,需要进行判断和选择的情况是很多的: 如果你在家,我去拜访你 如果考试不及格,要补考 如果遇到红灯,要停车等待 第四章 结构化程序设计 在现实生活中,需要进行判断和选择的情况..._在现实生活中遇到过条件判断的问

幻数使用说明_ioctl-number.txt幻数说明-程序员宅基地

文章浏览阅读999次。幻数使用说明 在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情。 因为设备都是特定的,这里也没法说。关键在于怎样组织命令码,因为在ioctl中命令码是唯一联系用户程序命令和驱动程序支持的途径 。 命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,利_ioctl-number.txt幻数说明

ORB-SLAM3 + VScode:检测到 #include 错误。请更新 includePath。已为此翻译单元禁用波浪曲线_orb-slam3 include <system.h> 报错-程序员宅基地

文章浏览阅读399次。键盘按下“Shift+Ctrl+p” 输入: C++Configurations,选择JSON界面做如下改动:1.首先把 “/usr/include”,放在最前2.查看C++路径,终端输入gcc -v -E -x c++ - /usr/include/c++/5 /usr/include/x86_64-linux-gnu/c++/5 /usr/include/c++/5/backward /usr/lib/gcc/x86_64-linux-gnu/5/include /usr/local/_orb-slam3 include 报错

「Sqlserver」数据分析师有理由爱Sqlserver之十-Sqlserver自动化篇-程序员宅基地

文章浏览阅读129次。本系列的最后一篇,因未有精力写更多的入门教程,上篇已经抛出书单,有兴趣的朋友可阅读好书来成长,此系列主讲有理由爱Sqlserver的论证性文章,希望读者们看完后,可自行做出判断,Sqlserver是否真的合适自己,目的已达成。渴望自动化及使用场景笔者所最能接触到的群体为Excel、PowerBI用户群体,在Excel中,我们知道可以使用VBA、VSTO来给Excel带来自动化操作..._sqlsever 数据分析

随便推点

智慧校园智慧教育大数据平台(教育大脑)项目建设方案PPT_高校智慧大脑-程序员宅基地

文章浏览阅读294次,点赞6次,收藏4次。教育智脑)建立学校的全连接中台,对学校运营过程中的数据进行处理和标准化管理,挖掘数据的价值。能:一、原先孤立的系统聚合到一个统一的平台,实现单点登录,统一身份认证,方便管理;三、数据共享,盘活了教育大数据资源,通过对外提供数。的方式构建教育的通用服务能力平台,支撑教育核心服务能力的沉淀和共享。物联网将学校的各要素(人、机、料、法、环、测)全面互联,数据实时。智慧校园解决方案,赋能教学、管理和服务升级,智慧教育体系,该数据平台具有以下几大功。教育大数据平台底座:教育智脑。教育大数据平台,以中国联通。_高校智慧大脑

编程5大算法总结--概念加实例_算法概念实例-程序员宅基地

文章浏览阅读9.5k次,点赞2次,收藏27次。分治法,动态规划法,贪心算法这三者之间有类似之处,比如都需要将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题。但其实这三者之间的区别还是蛮大的。贪心是则可看成是链式结构回溯和分支界限为穷举式的搜索,其思想的差异是深度优先和广度优先一:分治算法一、基本概念在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两_算法概念实例

随笔—醒悟篇之考研调剂_考研调剂抑郁-程序员宅基地

文章浏览阅读5.6k次。考研篇emmmmm,这是我随笔篇章的第二更,原本计划是在中秋放假期间写好的,但是放假的时候被安排写一下单例模式,做了俩机试题目,还刷了下PAT的东西,emmmmm,最主要的还是因为我浪的很开心,没空出时间来写写东西。  距离我考研结束已经快两年了,距离今年的考研还有90天左右。  趁着这个机会回忆一下青春,这一篇会写的比较有趣,好玩,纯粹是为了记录一下当年考研中发生的有趣的事。  首先介绍..._考研调剂抑郁

SpringMVC_class org.springframework.web.filter.characterenco-程序员宅基地

文章浏览阅读438次。SpringMVC文章目录SpringMVC1、SpringMVC简介1.1 什么是MVC1.2 什么是SpringMVC1.3 SpringMVC的特点2、HelloWorld2.1 开发环境2.2 创建maven工程a>添加web模块b>打包方式:warc>引入依赖2.3 配置web.xml2.4 创建请求控制器2.5 创建SpringMVC的配置文件2.6 测试Helloworld2.7 总结3、@RequestMapping注解3.1 @RequestMapping注解的功能3._class org.springframework.web.filter.characterencodingfilter is not a jakart

gdb: Don‘t know how to run. Try “help target“._don't know how to run. try "help target".-程序员宅基地

文章浏览阅读4.9k次。gdb 远程调试的一个问题:Don't know how to run. Try "help target".它在抱怨不知道怎么跑,目标是什么. 你需要为它指定target remote 或target extended-remote例如:target extended-remote 192.168.1.136:1234指明target 是某IP的某端口完整示例如下:targ..._don't know how to run. try "help target".

c语言程序设计教程 郭浩志,C语言程序设计教程答案杨路明郭浩志-程序员宅基地

文章浏览阅读85次。习题 11、算法描述主要是用两种基本方法:第一是自然语言描述,第二是使用专用工具进行算法描述2、c 语言程序的结构如下:1、c 语言程序由函数组成,每个程序必须具有一个 main 函数作为程序的主控函数。2、“/*“与“*/“之间的内容构成 c 语言程序的注释部分。3、用预处理命令#include 可以包含有关文件的信息。4、大小写字母在 c 语言中是有区别的。5、除 main 函数和标准库函数以..._c语言语法0x1e