T1--调换纸牌(card)

Alex有 n张纸牌,每张纸牌上都有一个值ai,Alex把这些纸牌排成一排,希望将纸牌按值从小到大的顺序排好。现在他把这个任务交给你,你只能进行一种操作:选中一张牌,然后插入到这一排纸牌中的任意位置。他想知道最少需要进行几次操作才能将纸牌排好,如果你能用最少的操作达到他的要求,他就请你吃大鸡排^ ^。

解法

求出最长不下降子序列,答案是\(n-len\)。

ac代码

#include<bits/stdc++.h>
#define N 500005
using namespace std;
int len,n;
int a[N],d[N];
int read(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch))w|=ch=='-',ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
int find(int x){
    int l=1,r=len,mid,ans=0;
    while(l<=r){
        mid=l+r>>1;
        if(d[mid]>x) r=mid-1,ans=mid;
        else l=mid+1;
    }
    return ans;
}
int main(){
    n=read();
    for(int i=1;i<=n;i++)a[i]=read();
    len=0;
    for(int i=1;i<=n;i++){
        int x=find(a[i]);
        if(d[x]!=0) d[x]=a[i];
        else d[++len]=a[i];
    }
    printf("%d\n",n-len);
    return 0;
}

T2--皮卡丘逃亡(pikaqiu)

皮卡丘和小智一行人在经过古代遗迹沙漠的时候被火箭队抓走了,皮卡丘一直在寻找机会逃走,一小时之后,皮卡丘趁火箭队不注意使用高压电击终于脱身,可它却掉落在荒无人烟的地方,皮卡丘没有多少体力了,它希望尽快回到小智身边。沙漠中有很多岩石,有些可以绕过,而有些却阻挡着皮卡丘前进的道路!皮卡丘每走一步都会消耗1点体力值,遇到岩石的时候,为了少跑一些路或者无路可走的时候,皮卡丘可以消耗5点体力值用钢尾来击碎岩石后到达岩石所在位置。已知皮卡丘现有的体力值T,沙漠大小为n*m,皮卡丘不能走出沙漠,因为沙漠外总是潜伏着可怕的黑眼鳄。请问它可以保证体力大于0的情况下到达小智身边吗?如果可以,输出到达能够保存的最大体力值,如果不行则输出-1。

解法

把所有的点都放到一个一维数组,建一个图,跑一遍spfa。

ac代码

#include<bits/stdc++.h>
#define N 505
#define M 1000005
#define inf 0x3f3f3f3f
using namespace std;
struct edge{
    int to,nt,w;
}E[M<<1];
int a[N][N];
int dis[N*N],H[N*N];
int cnt,tot,n,m,t,s,e;
bool vis[N*N];
int read(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch))w|=ch=='-',ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
void addedge(int u,int v,int w){
    E[++cnt]=(edge){v,H[u],w}; H[u]=cnt;
}
int calc(int x,int y){
    return (x-1)*m+y;
}
void spfa(int s,int e){
    queue<int>q;
    while(!q.empty())q.pop();
    for(int i=1;i<=tot;i++) dis[i]=inf,vis[i]=1;
    dis[s]=0; vis[s]=0;
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=1;
        for(int e=H[u];e;e=E[e].nt){
            int v=E[e].to;
            if(dis[u]+E[e].w<dis[v]){
                dis[v]=dis[u]+E[e].w;
                if(vis[v]){
                    vis[v]=0;
                    q.push(v);
                }
            }
        }
    }
}
int main(){
    t=read(),n=read(),m=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            a[i][j]=read();
            if(a[i][j]==5) s=calc(i,j);
            if(a[i][j]==9) e=calc(i,j);
        }
    cnt=0,tot=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            int x=calc(i,j);
            tot++;
            if(i+1<=n){
                if(a[i+1][j]==1) addedge(x,calc(i+1,j),5);
                else addedge(x,calc(i+1,j),1);
            }
            if(i-1>0){
                if(a[i-1][j]==1) addedge(x,calc(i-1,j),5);
                else addedge(x,calc(i-1,j),1);
            }
            if(j+1<=m){
                if(a[i][j+1]==1) addedge(x,calc(i,j+1),5);
                else addedge(x,calc(i,j+1),1);
            }
            if(j-1>0){
                if(a[i][j-1]==1) addedge(x,calc(i,j-1),5);
                else addedge(x,calc(i,j-1),1);
            }
        }
    spfa(s,e);
    if(dis[e]>t) puts("-1"); else printf("%d\n",t-dis[e]);
    return 0;
}

T3--区间最小(min)

一个含有n项的数列(n<=1000000),求出每一项前面的第m个数到它这个区间内的最小值Mini。

解法

非常明显的单调队列,思路:每次将已经超出的全部弹出队首,然后将大于插入数的队尾的数全部弹出,答案就是队首。

ac代码

#include<bits/stdc++.h>
#define N 1000005
using namespace std;
int n,m;
int a[N],p[N];
struct node{
    int x,p;
};
struct Queue_o{
    node q[N];
    int l,r;
    void init(){
        l=1,r=0;
    }
    bool empty(){
        return l>r;
    }
    void push_back(node x){
        q[++r]=x;
    }
    node front(){
        return q[l];
    }
    void pop_front(){
        l++;
    }
    node back(){
        return q[r];
    }
    void pop_back(){
        r--;
    }
}q;
int read(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch))w|=ch=='-',ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
int main(){
    q.init();
    n=read(),m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<=n;i++){
        while(i-q.front().p>m) q.pop_front();
        while(a[i]<q.back().x&&!q.empty()) q.pop_back();
        q.push_back((node){a[i],i});
        printf("%d ",q.front().x);
    }
    return 0;
}

T4--聪明幽默的(smrtfum)

JYM 的博客非常有名,他在博客里写了N 篇文章,他给每片文章定义了智慧值si 和有趣值fi,他希望选出一些文章来展览使得这些文章的sumsi+sumfi 最大,当然选出的文章的sumsi 和sumfi 的值都不能小于0,这样会使别人觉得他很笨或者很无趣,因为他写的文章太多,就由你告诉他,sumsi+sumfi 的最大值为多少。

解法

简单的背包问题,状态是\(f[i][j]\)表示前\(i\)件物品,\(j\)的\(sums\)下的最大的\(sumf\)

\[f[i][j+s[i]]=max(f[i-1][j]+s[i]+f[i],f[i-1][j+s[i]],f[i]+s[i]]);\]

ac代码

#include<bits/stdc++.h>
#define N 105
using namespace std;
const int base=1e5;
int n,ss[N],sf[N];
int f[N][(int)(1e5)<<1];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d",&ss[i],&sf[i]);
    memset(f,-0x3f,sizeof(f));
    f[0][(int)1e5]=0;
    for(int i=1;i<=n;i++) for(int j=max(0,-ss[i]);j+ss[i]<2e5;j++) f[i][j+ss[i]]=max(max(f[i-1][j]+ss[i]+sf[i],f[i-1][j+ss[i]]),f[i][j+ss[i]]);
    int ans=-1e8;
    for(int i=1e5;i+ss[n]<2e5;i++) if(f[n][i]>=i-1e5) ans=max(ans,f[n][i]);
    printf("%d\n",ans);
    return 0;
}

[hgoi#2019/2/18]比较水的更多相关文章

  1. 2019.3.18考试&2019.3.19考试&2019.3.21考试

    2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...

  2. [hgoi#2019/3/21]NOIP&NOI赛后总结

    前言 今天做的是是2010年提高组和NOI的题目,做过几道原题,但是还是爆炸了,我真的太弱了. t1-乌龟棋 https://www.luogu.org/problemnew/show/P1541 这 ...

  3. [hgoi#2019/3/10]赛后总结

    关于本次hg模拟赛,题目来源于CF1110. t1-无意义运算符(meaning) 题目描述 最大公约数和位运算之间有共同点吗?是时候来研究一下了. 给定一个正整数a,请找到一个闭区间[1,a-1] ...

  4. [hgoi#2019/3/3]赛后总结

    T1--最长公共前缀(lcp) 定义两个字符串S,T 的最长公共前缀lcp(S,T)为最长的字符串R,满足R 既是S 的前缀又是T 的前缀. 给定一个字符串S,下标从1 开始,每次询问给出四个正整数a ...

  5. 2019.4.18 HTML + CSS相关整理

    目录 标签 块标签 行标签 行块转化 嵌套规则 css引入方式 行间样式 内部引入 外部引入 选择器 基础选择器 组合选择器 盒模型 css样式 字体属性 设置字体的大小 设置字体的粗细 设置字体的风 ...

  6. jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)

    Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...

  7. MySQL存储过程-2019/7/18

    MySQL 5.0 版本开始支持存储过程. 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象. 存储过程是为了完成特定功能的SQL语句集,经编 ...

  8. 6362. 【NOIP2019模拟2019.9.18】数星星

    题目描述 题解 一种好想/好写/跑得比**记者还快的做法: 对所有询问排序,按照R递增的顺序来处理 维护每个点最后一次被覆盖的时间,显然当前右端点为R时的答案为所有时间≥L的点的权值之和 LCT随便覆 ...

  9. 2019.06.18训练日记(赞FLS)

    之前打了几场比赛,有很多题没做出来,这些题无论是知识点不会,还是说在当时时间和思路的影响下没有做出来,这都应该做出来,至少现在必须做出来,本来打算专心复习,分数高了,好保研,但是想了想如果局限于只把学 ...

随机推荐

  1. LiveCharts文档-4基本绘图-2基本柱形图

    原文:LiveCharts文档-4基本绘图-2基本柱形图 4基本绘图-2基本柱形图 using System.Windows.Forms; using LiveCharts; using LiveCh ...

  2. MonkeyRunner 模块

    用python编写脚本   1.导入模块: MonkeyRunner MonkeyDevice MonkeyImage ps:如果给导入模块起别名,就应该使用别名,而不能使用原名,否则会出现错误. f ...

  3. 【JVM.4】调优案例分析与实战

    之前已经介绍过处理Java虚拟机内存问题的知识与工具,在处理实际项目的问题时,除了知识与工具外,经验同样是一个很重要的因素.本章会介绍一些具有代表性的案例. 本章的内容推荐还是原文全篇看完的好,实在不 ...

  4. [UWP 自定义控件]了解模板化控件(8):ItemsControl

    1. 模仿ItemsControl 顾名思义,ItemsControl是展示一组数据的控件,它是UWP UI系统中最重要的控件之一,和展示单一数据的ContentControl构成了UWP UI的绝大 ...

  5. springboot整合curator实现分布式锁

    理论篇: Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处 ...

  6. Linux虚拟机下与主机通信

    1.更改虚拟机ip和主机ip同一网段 2.配置虚拟机的网络适配器 3.主机进行ping测试

  7. 软件工程(GZSD2015)学生博客列表

    2015年贵州师范大学软件工程课程学生博客列表 陈小丽 郑倩 唐洁 周娟 李利思 肖俊 罗文豪 周静 徐明艳 毛涛 邓洪虹 岳庆 李盼 安坤 何亚 涂江凤 张义平 杨明颢 杨家堂 胡贵玲 寿克霞 吴明 ...

  8. PAT 1007 素数对猜想

    https://pintia.cn/problem-sets/994805260223102976/problems/994805317546655744 让我们定义 d~n~ 为:d~n~ = p~ ...

  9. Eclipse布局问题小记

    当Eclipse的Debug,Console(简称工具条)页面被误操作到占据整行时,通过点击工具条的非选项卡部分,然后向代码区域拖动,即可得恢复非单独行模式.

  10. CentOS Mininal 安装VMtools的方法

    1. 下载安装CentOS75 的mininal版本 2. 安装完成之后挂在vmtools. 虚拟机管理,安装vmtools即可 3. ssh登录虚拟机. cd /dev 进入到设备系统 mount ...