偷盗生涯

实在自己是一个贼,我不时偷心,不过这是父大姨把自己生得太帅,不可能怪我。

1. 磨炼计划(exercise.pas)

人身是变革的资本,OIers不要因为紧张的上学和整天在电脑前而忽略了常规问题。小x设计了投机的训练计划,但她不精通这多少个计划是否有效,换句话说倘诺计划不当可能会让她的体力超支,所以小x请您帮衬他。

一天有1440秒钟,所以小x列出的是这一整天第1至第1440秒钟的计划。小x的体力用一个平头来代表,他会听从计划表举行磨练,同时,每分钟小x的体力会自动增添1。假设某一分钟末小x的体力小于等于零,那么可怜的小x就累死了……

 

输入(exercise.in)

先是行是用空格分开的七个整数n,m,分别表示小x的起首体力值和计划的系列数目。

从第二行初叶的m行,每行描述一个磨砺项目:名称、最先时间a、结束时间b、每分钟消耗的体力(用空格分隔),表示此项目从第a分钟初开端,第b分钟末截至。操练项目比照起始时间递增顺序给出,不会出现多少个品种时间顶牛的情状。

 

输出(exercise.out)

      
输出包括两行,假使计划可行,第一行输出”Accepted”,第二行输出这一天之后最终剩余的体力;否则在第一行输出”Runtime
Error”,第二行输出在第几秒钟累死。

 

样例

Input

Output

10 1

Basketball 1 10 1

Accepted

1440

1 1

Nunchakus 1 1 2

Runtime Error

1

 

约定

0<n<=2^31-1

0<=m<=500

具有中间值的相对化值不会领先2^31-1

每一个砥砺项目的称谓不超越20个字符,其中不含空格。

魔兽争霸 1魔兽争霸 2

/*
    线段树维护每分钟消耗的体力,每个运动相当于一个区间查询
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 510
long long s,a[2000],b[2000];
int n;
char ch[30];
struct node{
    int l,r;
    long long v,lazy;
}tr[maxn<<4];
long long qread(){
    long long i=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch<='9'&&ch>='0'){i=i*10+ch-'0';ch=getchar();}
    return i;
}
void build(int l,int r,int k){
    tr[k].l=l;tr[k].r=r;
    if(l==r)return;
    int mid=(l+r)>>1;
    build(l,mid,k<<1);
    build(mid+1,r,k<<1|1);
}
void updata(int k){
    if(tr[k].l==tr[k].r)return;
    int l,r;
    long long v=tr[k].lazy;
    l=tr[k<<1].l;r=tr[k<<1].r;
    tr[k<<1].v=(r-l+1)*v;
    tr[k<<1].lazy+=v;

    l=tr[k<<1|1].l,r=tr[k<<1|1].r;
    tr[k<<1|1].v=(r-l+1)*v;
    tr[k<<1|1].lazy+=v;
    tr[k].lazy=0;
}
void change(int l,int r,long long v,int k){
    if(tr[k].l>=l&&tr[k].r<=r){
        tr[k].v+=(tr[k].r-tr[k].l+1)*v;
        tr[k].lazy+=v;
        return;
    }
    if(tr[k].lazy)updata(k);
    int mid=(tr[k].l+tr[k].r)>>1;
    if(l<=mid)change(l,r,v,k<<1);
    if(r>mid)change(l,r,v,k<<1|1);
    tr[k].v=tr[k<<1].v+tr[k<<1|1].v;
}
long long find(int op,int k){
    if(tr[k].l==tr[k].r)return tr[k].v;
    if(tr[k].lazy)updata(k);
    int mid=(tr[k].l+tr[k].r)>>1;
    if(op<=mid)return find(op,k<<1);
    if(op>mid)return find(op,k<<1|1);
    tr[k].v=tr[k<<1].v+tr[k<<1|1].v;
}
int main(){
    //freopen("Cola.txt","r",stdin);
    freopen("exercise.in","r",stdin);
    freopen("exercise.out","w",stdout);
    s=qread();
    scanf("%d",&n);
    int x,y;long long z;
    build(1,1440,1);
    for(int i=1;i<=n;i++){
        scanf("%s%d%d",ch,&x,&y);
        cin>>z;
        change(x,y,z,1);
    }
    for(int i=1;i<=1440;i++)a[i]=find(i,1);
    b[0]=s;
    for(int i=1;i<=1440;i++){
        b[i]=b[i-1]+1;
        b[i]-=a[i];
        if(b[i]<=0){
            printf("Runtime Error\n%d",i);
            return 0;
        }
    }
    printf("Accepted\n%d",b[1440]);
    return 0;
}

100分 线段树

言归正传,我刻钟候动过盗窃的念头,大概是自家小学一年级的时候,门口有个小人书摊,当时自己看着儿童们在看书借书,我忽然动了一个心境,我能不可以拿一本然后逃走吗?当时自我早就若隐若现知道这种事不佳,经过一番天人作战加上生性胆小,我最终未能动手。

2.小猫爬山(catclimb.pas)

题目叙述

弗瑞德(Fred)a和rainbow饲养了N只小猫,那天,小猫们要去爬山。经历了劳累,小猫们毕竟爬上了高峰,可是疲倦的它们再也不想徒步走下山了(呜咕>_<)。

Freda和rainbow只可以花钱让它们坐索道下山。索道上的缆车最大承重量为W,而N只小猫的份量分别是C1、C2……CN。当然,每辆缆车上的小猫的重量之和不可能抢先W。每租用一辆缆车,Fred(Fred)a和rainbow就要付1新币,所以他们想理解,最少需要付多少比索才能把这N只小猫都运载下山?

输入格式

率先行包含五个用空格隔开的平头,N和W。

接下去N行每行一个整数,其中第i+1行的整数表示第i只小猫的分量C i。

输出格式

出口一个整数,最少需要有些卢比,也就是起码需要多少辆缆车。

样例输入

5 1996

1

2

1994

12

29

样例输出

2

数量范围与约定

对于100%的数据,1<=N<=18,1<=C i <=W<=10^8。

魔兽争霸 3魔兽争霸 4

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,w,ans,a[20],b[20];
void dfs(int now,int sum){
    if(sum>=ans)return;
    if(now==n+1){
        ans=min(ans,sum);
        return;
    }
    for(int i=1;i<=sum;i++){//往以前用过的背包里装 
        if(b[i]+a[now]<=w){
            b[i]+=a[now];
            dfs(now+1,sum);
            b[i]-=a[now];
        }
    }
    if(sum==n)return;
    b[sum+1]+=a[now];
    dfs(now+1,sum+1);
    b[sum+1]-=a[now];
}
int main(){
    //freopen("Cola.txt","r",stdin);
    freopen("catclimb.in","r",stdin);
    freopen("catclimb.out","w",stdout);
    scanf("%d%d",&n,&w);ans=n;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    dfs(1,0);
    printf("%d",ans);
    return 0;
}

74分 暴力

魔兽争霸 5魔兽争霸 6

/*
    暴力之前先从大到小排个序
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,w,ans,a[20],b[20];
void dfs(int now,int sum){
    if(sum>=ans)return;
    if(now==n+1){
        ans=min(ans,sum);
        return;
    }
    for(int i=1;i<=sum;i++){//往以前用过的背包里装 
        if(b[i]+a[now]<=w){
            b[i]+=a[now];
            dfs(now+1,sum);
            b[i]-=a[now];
        }
    }
    if(sum==n)return;
    b[sum+1]+=a[now];
    dfs(now+1,sum+1);
    b[sum+1]-=a[now];
}
bool cmp(int x,int y){
    return x>y;
}
int main(){
    //freopen("Cola.txt","r",stdin);
    freopen("catclimb.in","r",stdin);
    freopen("catclimb.out","w",stdout);
    scanf("%d%d",&n,&w);ans=n;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+n+1,cmp);
    dfs(1,0);
    printf("%d",ans);
    return 0;
}

100分

第五遍的行窃经历甚至如此怂,有点说不出口。话说过了5年,我曾经长成了1米50的小帅哥,小学也搬到了新校舍。新校舍是在大家平常玩的一块草地上翻建的,就从我家的小村庄走出来过了桥便是。原先我和邻里家的一伙小孩,平日在这时候放风筝和练纸飞镖,改建成小学后,大家就平常在这边玩一种扔砖头的游乐,和魔兽争霸一样好玩。砖头的材料是泥土,电脑芯片也是泥土中的硅做的,可见孩子们的玩乐都是中外赐予的。

3.魔兽角逐(war.pas)

小x正在称心快意地玩魔兽

他正操纵着死亡骑士和n个食尸鬼(编号1~n)去打猎

 

去世骑士有个魔法,叫做“死亡缠绕”,可以给食尸鬼补充HP

打仗历程中仇敌会对食尸鬼实施攻击,食尸鬼的HP会减弱

 

小x希望时刻了然自己部队的意况,即HP值第k多的食尸鬼有些许HP,以便控制哪些排放魔法

请同学们协助他:)

 

小x向你生出3种信号:(下划线在输入数据中显示为空格)

A_i_a表示敌军向第i个食尸鬼发出了攻击,并使第i个食尸鬼损失了a点HP,假设它的HP<=0,那么这些食尸鬼就死了(Undead也是要死的……)。

敌军不会攻击一个已死的食尸鬼。

C_i_a 表示死亡骑士向第i个食尸鬼放出了回老家缠绕,并使其增添了a点HP。

HP值没有上限。

呜呼骑士不会向一个已死的食尸鬼发出死亡缠绕

Q_k  表示小x向你暴发询问

魔兽争霸, 

输入(war.in)

先是行,一个正整数 n

从此未来n个整数 表示n个食尸鬼的开首HP值

随即一个正整数m

以下m行 每行一个小x发出的信号

 

输出(war.out)

对此小x的各样询问,输出HP第k多的食尸鬼有微微HP,假使食尸鬼总数不足k个,输出-1。每个一行数。

最终一行输出一个数:战斗截止后剩余的食尸鬼数

 

样例

Input

Output

5

1 2 3

4 5

10

Q 2

A 4 6

C 1 4

Q 2

A 2 1

A 3 3

A 1 3

Q 4

C 2 10

Q 1

4

5

-1

11

3

 

 

约定

40%的数据  n<=3000  m<=5000

70%的数据  n<=8000  m<=10000

100%的数据  n<=30000  m<=50000

90%的数量随机生成

食尸鬼HP没有上限

数据保证自由时刻食尸鬼的HP值在longint范围内

多太尉证A和C命令中的食尸鬼是活着的

输入数据中从来不剩余空格、换行

魔兽争霸 7魔兽争霸 8

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,cnt;
struct node{
    int v,id;
}a[30010];
char ch[2];
bool cmp1(node x,node y){return x.v>y.v;}
bool cmp2(node x,node y){return x.id<y.id;}
int main(){
    //freopen("in.txt","r",stdin);
    freopen("war.in","r",stdin);
    freopen("war.out","w",stdout);
    scanf("%d",&n);cnt=n;
    for(int i=1;i<=n;i++)scanf("%d",&a[i].v),a[i].id=i;
    int x,y;
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        scanf("%s",ch);
        if(ch[0]=='A'){
            scanf("%d%d",&x,&y);
            if(a[x].v<=0)continue;
            a[x].v-=y;
            if(a[x].v<=0)cnt--;
        }
        if(ch[0]=='C'){
            scanf("%d%d",&x,&y);
            if(a[x].v<=0)continue;
            a[x].v+=y;
        }
        if(ch[0]=='Q'){
            scanf("%d",&x);
            if(x>cnt){
                printf("-1\n");
                continue;
            }
            sort(a+1,a+n+1,cmp1);
            printf("%d\n",a[x].v);
            sort(a+1,a+n+1,cmp2);
        }
    }
    printf("%d\n",cnt);
    return 0;
}

30分 暴力

魔兽争霸 9魔兽争霸 10

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<map>
#include<algorithm>
#define ll long long 
using namespace std;
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*10+ch-'0';ch=getchar();}
    return x*f;
}
int tmp;
int n,m,root,size;
int b[300005],v[300005],w[300005],s[300005],rnd[300005];
int ls[300005],rs[300005];
bool tag[300005];
void update(int k){s[k]=s[ls[k]]+s[rs[k]]+w[k];}
void rturn(int &k)
{int t=ls[k];ls[k]=rs[t];rs[t]=k;update(k);update(t);k=t;}
void lturn(int &k)
{int t=rs[k];rs[k]=ls[t];ls[t]=k;update(k);update(t);k=t;}
void insert(int &k,int num)
{
    if(!k){k=++size;rnd[k]=rand();w[k]=s[k]=1;v[k]=num;return;}
    s[k]++;
    if(num==v[k]){w[k]++;return;}
    else if(num<v[k]){insert(ls[k],num);if(rnd[ls[k]]<rnd[k])rturn(k);}
    else {insert(rs[k],num);if(rnd[rs[k]]<rnd[k])lturn(k);}
}
void del(int &k,int num)
{
    if(!k)return;
    if(num==v[k])
    {
        if(w[k]>1){w[k]--;s[k]--;return;}
        if(ls[k]*rs[k]==0)k=ls[k]+rs[k];
        else if(rnd[ls[k]]<rnd[rs[k]]){rturn(k);del(k,num);}
        else {lturn(k);del(k,num);}
    }
    else if(num<v[k])
        {del(ls[k],num);s[k]--;}
    else {del(rs[k],num);s[k]--;}
}
int query(int k,int x)
{
    if(!k)return -1;
    if(s[ls[k]]>=x)return query(ls[k],x);
    else if(x>s[ls[k]]+w[k])return query(rs[k],x-w[k]-s[ls[k]]);
    else return k;
}
int main()
{
    freopen("war.in","r",stdin);
    freopen("war.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++)b[i]=read();
    for(int i=1;i<=n;i++)insert(root,b[i]);
    m=read();
    int k,x;
    for(int i=1;i<=m;i++)
    {
        char ch[2];
        scanf("%s",ch);
        if(ch[0]=='A')
        {
            k=read();x=read();
            del(root,b[k]);b[k]-=x;
            if(b[k]>0)insert(root,b[k]);
            else n--;
        }
        else if(ch[0]=='C')
        {
            k=read();x=read();
            del(root,b[k]);b[k]+=x;
            insert(root,b[k]);
        }
        else 
        {
            k=read();
            if(k>n)puts("-1");
            else printf("%d\n",v[query(root,n-k+1)]);
        }
    }
    printf("%d\n",n);
    return 0;
}

100分 主席树

 

到了寒暑假的时候,高校就改为了空城,一所乡村校舍也未曾怎么值钱的事物,所以连门卫都尚未。大家就爬进去踢球。有心上人拿塑料卡片撬门,我们就溜进教室,把课桌拼成乒乓台打起了乒乓球。有时候大家也打80分,下四国大战,到后来大家通常打麻将赌博。某次有个东西把体育场馆也撬开了,于是大家就进入偷书。

4.暗黑破坏神(diablo.pas)

无聊中的小x玩起了Diablo I…

 

打闹的主人翁有n个魔法

各样魔法分为若干个等级,第i个魔法有p[i]个等级(不包括0)

各类魔法的每个阶段都有一个功能值,一个j级的i种魔法的效能值为w[i][j]

魔法升一级需要一本相应的魔法书

购买魔法书需要金币,第i个魔法的魔法书价格为c[i]

而小x唯有m个金币(好孩子不用修改器)

 

你的天职就是协助小x决定哪些购得魔法书才能使拥有魔法的效益值之和最大

发端时享有魔法为0级 效果值为0

 

输入(diablo.in)

先是行 用空格隔开的六个整数n m

以下n行 描述n个魔法

第i+1行描述 第i个魔法 格式如下

c[i] p[i] w[i][1] w[i][2] … w[i][p[i]]

 

输出(diablo.out)

先是行输出一个平头,即最大效果值。

后来n行输出你的方案:

第i+1行有一个平头v[i] 表示你决定把第i个魔艺术学到v[i]级

设若有多解 输出花费金币最少的一组

如若还多解 输出任意一组

 

样例

Input

Output

3 10

1 3 1 2 2

2 3 2 4 6

3 3 2 1 10

11

1

0

3

 

约定

0<n<=100

0<m<=500

0<p[i]<=50

0<c[i]<=10

保证输入数据和结尾结果在longint范围内

 

看来看去其实好书不多,小伙伴们都气愤的走了。什么《红岩》《林海雪原》《山村巨变》这种书也太主旋律了,一点都不为难,武侠小说极少,唯有一本梁羽生的《云海玉弓缘》,好书,可惜我看过了,没拿。我最后拿了一本薄薄的小开面的《黄山谷词选》。一般的怎么李杜太普通了,我看在豫章先生和自身同姓,带着一种亲切感就把它偷走了。犯罪的觉得其实很鼓舞,因其带着一种羞耻感,我也尚无辜负自己的赃物,后来有事没事就把它拿出来阅读。

豫章先生其实是一位我国历史上极为重要的读书人,依旧个书法我们。我准备背几首他的词,可惜他到底不是自己欢喜的Style,写的事物远不如苏东坡“大江东去”那么舒心,也不如李煜“恰似一江春水向东流”那么柔美动人,不像易安居士这般有斗志,“至今思项羽,不肯过江东”,不像李义山的闷骚悱恻,他写的事物硬邦邦,清瘦,没有人味。宋末之后我国的野史从未那么灿烂了,后来尽是东厂西厂了,黄山谷的词感觉像帝国的末段一抹斜阳一般无力。

行窃的野史随着我的小高校一去不复返了。在非常资讯贫乏的年代,我们找到一本好书便疯狂吮吸,大家再也不用潜入什么乡村教室,结果还只可以偷到一本食之无味、弃之可惜的词集。目前免费资源到处都是,上个百度,下个书库,便有看不完的经文名篇,而且都是好书。

自家好像又潜入了体育场馆,面对广大书海,我又纳闷了。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website