3月21日考试 题解(数据结构+区间DP+贪心)

前言:T3写挂了,有点难受。

---------------

T1 中位数

题意简述:给你一段长度为$n$的序列,分别输出$[1,2k-1]$的中位数$(2k-1\leq n)$。

-------------

其实正解是用两个堆分别为大根堆和小根堆。但我这里偷了个懒,直接由STL函数upper_bound二分查找插入数字(STL大法好

Code:

#include<bits/stdc++.h>
using namespace std;
vector<int> v;
int n;
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        v.insert(upper_bound(v.begin(),v.end(),x),x);
        if (i%2==1)
            printf("%d\n",v[(i-1)/2]);
    }
    return 0;
} 

T2 多边形

题意简述:给你一个有n个边的多边形,每个顶点上有一个数字,每条边上为$+$或$\times $ .现在去掉任意一条边,求运算的最大值.

--------------

这道题其实跟石子合并有点像,不过有一点要注意:1.子区间的合并受运算符号限制;2.可能有负数,所以我们同时要维护最小值,因为有可能负乘负大于当前数.

题目细节较多.

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=55;
int f[maxn*2][maxn*2][maxn*2],mf[maxn*2][maxn*2][maxn*2];
int ch[maxn*2],a[maxn*2];
int n,ans=-0x3f3f3f3f;
int maxx(int a,int b,int c,int d,int e)
{
    return max(a,max(b,max(c,max(d,e))));
}
int minn(int a,int b,int c,int d,int e)
{
    return min(a,min(b,min(c,min(d,e))));
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n*2;j++)
            for (int k=1;k<=n*2;k++) f[i][j][k]=-0x3f3f3f3f,mf[i][j][k]=0x3f3f3f3f;
    for (int i=1;i<=2*n;i++)
    {
        if (i%2==1){
            char c;cin>>c;
            if (c==‘t‘) ch[i/2+1]=1;
            else ch[i/2+1]=2;
        }
        else cin>>a[i/2];
    }
    for (int i=n+1;i<=n*2;i++)
    {
        a[i]=a[i-n];
        ch[i]=ch[i-n];
    }
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n*2;j++) f[i][j][j]=mf[i][j][j]=a[j];
    for (int i=1;i<=n;i++)
    {
        for (int len=2;len<=n;len++)
        {
            for (int j=i;j<=i+n-1;j++)
            {
                int k=j+len-1;
                if (k>=i+n) break;
                for (int l=j;l<k;l++)
                {
                    if (ch[l+1]==1) {
                        f[i][j][k]=max(f[i][j][k],f[i][j][l]+f[i][l+1][k]);
                        mf[i][j][k]=min(mf[i][j][k],mf[i][j][l]+mf[i][l+1][k]);
                    }
                    else{
                        f[i][j][k]=maxx(f[i][j][k],f[i][j][l]*f[i][l+1][k],f[i][j][l]*mf[i][l+1][k],mf[i][j][l]*f[i][l+1][k],mf[i][j][l]*mf[i][l+1][k]);
                        mf[i][j][k]=minn(mf[i][j][k],f[i][j][l]*f[i][l+1][k],f[i][j][l]*mf[i][l+1][k],mf[i][j][l]*f[i][l+1][k],mf[i][j][l]*mf[i][l+1][k]);
                    }
                }
            }
        }
        ans=max(ans,f[i][i][i+n-1]);
    }
    printf("%d",ans);
    return 0;
} 

T3 连锁店

题意简述:张三开了$n$个连锁店,每个连锁店能用$a_{i}$个空瓶换$b_{i}$瓶水.每个店都可以无限次兑换,现在李四有$s$瓶水,求最多的兑换次数.如果不存在输出$-1$.

$n\leq 100000$,$s,a_{i},b_{i}\leq 10^{19}$.

---------------------

无解的情况:当$s\geq a_{i}$并且$a_{i}\leq b_{i}$.在输入的时候顺便判断.

我们考虑贪心:以$a_{i}-b_{i}$作为关键字排序很显然差值越小,兑换次数越多.

记得开$unsigned$ $long$ $long$.

Code:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int maxn = 1e5+7,mod = 1e9+7;
struct node{ll x,y,z;}a[maxn];
bool operator < (const node a,const node b){
    if(a.z != b.z)return a.z < b.z;
    return a.x<b.x;
}
int main()
{
    int n,flag = 0;    ll s,ans = 0;
    scanf("%d%llu",&n,&s);
    for(int i=0;i<n;i++){
        scanf("%llu%llu",&a[i].x,&a[i].y);
        if(a[i].x>s)n--,i--;
        else if(a[i].x<=a[i].y)flag = 1;
        a[i].z = a[i].x-a[i].y;
     }
    if(flag)return 0*puts("-1");
    sort(a,a+n);
    for(int i=0;i<n;i++){
    if(s>=a[i].x){
         ll tmp = (s-a[i].x)/a[i].z+1;
        ans += tmp;
         s -= tmp*a[i].z;
    }
    printf("%llu\n",ans);
    return 0;
}
     

原文地址:https://www.cnblogs.com/Invictus-Ocean/p/12543037.html

时间: 2024-08-29 18:31:38

3月21日考试 题解(数据结构+区间DP+贪心)的相关文章

10月2日考试题解(待更新)

10月2日考试题解 $ T1 $ : 题意简述: 给一棵 $ n $ 个节点的树,点有非负权值,你需要找出两条点不相交的路径,使它们长度和最大. $ n\le 10^5 $ $ solution: $ 有直径的性质可知,最终两条路径只有两种情况: 两条路径其中一条为直径 两条路径都有一个端点为直径端点 于是我们两遍 $ DFS $ 找到一条直径,并记录这条直径.将这条直径标记(删掉),从直径的每个点开始向直径两边树型 $ DP $ ,找到从直径上每个点出发的最长链,以及不与直径相交的最长链(这个

【水】4月21日模拟题解

(((((((((((((((((((((((((((((((((((((((((((((((((((((4.21模拟题解((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 欢迎查看本校最水题解 第1 题 小麦亩产一千八 [问题描述] "有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾--", 话说HYSBZ(Hengyang School for Boys & Zy)学识渊博孩纸们一讲到粮食,都

6月21日 bc总结

6月21日 bc总结 最近bc由于急于提交,增加了WA的概率,今天1001数据没测完全就提交了,WA了一次,很不划算,在bc等于罚时10min,下次一定要确保数据正确且所有的情况都考虑到再提交. 1001 水题,5分钟WA了一次,6分钟过.手速还是慢了,重点是居然WA了一次. 1002 给定一个数组,多次询问L和R区间内的逆序数. 数组大小是小于1000. 暴力FST了. 思路:设dp(l,r)为区间 l 到 r 的逆序数.dp(l,r)=dp(l,r-1)+cnt(l,r),其中cnt(l,r

Linux运维学习-2——2016年7月21日

格式说明: 操作 概念 命令 说明及举例 二 internet 因特网ethernet 以太网ctrl+alt+F1 图形界面ctrl+alt+F2-F6 字符界面 命令:who am i/who/who me i/tty/df/ifconfig/w/ halt 关机 reboot 重启 chvt 1-6 切换终端 init 3 关闭图形界面 init 5 打开图形界面 cp 复制 pwd 显示当前目录 lsblk 列出硬盘信息 id -u mg 查看用户ID,root为9,其他为普通用户,不加

【每日圣经日历】2014年9月21日

Dimanche le 21 Septembre 2014 礼拜日 2014年9月21日 O Dieu! tu ne dédaignes pas un coeur brisé et contrit.                                                                      Psaumes 51. 17 神啊,忧伤痛悔的心,你必不轻看.                                                  

2014年8月21日 &nbsp; 第一天学习linux linux的下载地址

第一天学习linux 个人实验用的linux版本为CentOS linux 下载地址: 32位版本      http://mirror.symnds.com/distributions/CentOS-vault/6.3/isos/i386/CentOS-6.3-i386-LiveDVD.iso 64位版本  http://mirror.symnds.com/distributions/CentOS-vault/6.3/isos/x86_64/CentOS-6.3-x86_64-LiveDVD.

1月21日全球域名商解析新增量24强:西数升至第二

IDC评述网(idcps.com)01月25日报道:根据DailyChanges公布的最新数据显示,在2016年1月21日全球域名解析新增量24强比拼中,DOMAINCONTROL.COM蝉联第一,新增量为40,065个.西部数码居亚,新增量23,779个,较上期的2,009个明显增大,排名上升7位.中国万网坚守第3,新增量8,375个,环比缩小.接下来,请看IDC评述网整理的数据情况分析. (图1)全球域名解析商(国际域名)解析新增量Top24分布图 细看图1,可获悉1月21日全球域名解析新增

北京Uber优步司机奖励政策(4月21日)

滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfryf/p/4612609.html 优步奖励低/不挣钱/怎么办?看这里:http://www.cnblogs.com/mfryf/p/4642173.html 打豪车应用:uber详细攻略(附100元优惠码:DL8T6):http://www.cnblogs.com/mfryf/p/4752167.h

成都Uber优步司机奖励政策(4月21日)

滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfryf/p/4612609.html 优步奖励低/不挣钱/怎么办?看这里:http://www.cnblogs.com/mfryf/p/4642173.html 打豪车应用:uber详细攻略(附100元优惠码:DL8T6):http://www.cnblogs.com/mfryf/p/4752167.h