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. Nginx URL后面不加斜杠301重定向

    今天开发碰到一个问题,其实之前就有这个问题,但是一直都没去关注,今天测试碰到了就解决一下. 问题情况: 当我请求 http://admindev.jingruiauto.com/store/views ...

  2. MATLAB找不到遗传算法工具箱,用不了gatool命令的解决方案

    解决方案 官方解释如下: gatool was removed as of R2015b. Use optimtool 在MATLAB R2015b前的版本可以使用gatool调用遗传算法工具箱,我测 ...

  3. CrackMe-005全破详解(图文+源码)--上篇

    逆向破解 | 逆向 | 逆向分析 | CrackMe | Crack | CrackMe5 | CrackMe05 前言 CrackMe005,都说比较变态,很多人给放过去了,但是我还是决定上了它,既 ...

  4. BGFX 渲染引擎中着色器代码的调试方法

    在实时渲染的图形开发中,着色器代码(Shader)越来越复杂,于是单纯的靠经验和不断试错的开发和调试方法早已不能满足实际需求.使用调试工具进行调试,成为开发中重要的方法.Bgfx 是一款跨平台.抽象封 ...

  5. Pair Project —— Elevator Scheduler

    结对编程人员 12061153 刘丽萍 12061154 冯飘飘 说明结对编程的优点和缺点. 结对编程的优点: 以前都是自己一个人编程,对于相互结对或者团队编程都没有接触过.而自己在写代码时不可避免的 ...

  6. M1事后分析汇报以及总结

    一.设想和目标 1. 们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要是为了提供周边美食和菜谱查询功能,为“吃货”们提供便利.对典型用户和场景有清晰的描 ...

  7. 《Linux内核分析》实践2

    <Linux及安全>实践2 一.Linux基本内核模块 1.1什么是内核模块 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一 ...

  8. Java web错误总结~

    1.java程序中没有错,但是项目上面显示一个红叉的解决办法 错误信息: 报Description  Resource Path Location Type Java compiler level d ...

  9. FZU软工第五次作业-词组频率分析

    目录 00.前言: 01.分工: 02.PSP表格: 03.解题思路描述与设计实现说明: 解题思路简述: 关键代码 04.附加题设计与展示: 设计的创意独到之处 实现思路 实现成果展示 05.关键代码 ...

  10. HDU 2012 素数判定

    http://acm.hdu.edu.cn/showproblem.php?pid=2012 Problem Description 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括 ...