zoukankan      html  css  js  c++  java
  • 10.11 noip模拟试题

     

    4题均为128M1s

    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个字符,其中不含空格。

     XXX偷懒用读入优化无视字符没想到字符里面由数字QAQ

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define maxn 510
    #define ll long long
    using namespace std;
    ll now,n,falg;
    char s[100];
    struct node{
        ll a,b,c;
    }p[maxn];
    ll init(){
        ll x=0,f=1;char s=getchar();
        while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x*f;
    }
    ll Cal(ll x,ll y){
        if(x%y==0)return x/y;
        else return x/y+1;
    }
    int main()
    {
        freopen("exercise.in","r",stdin);
        freopen("exercise.out","w",stdout);
        now=init();n=init();
        for(int i=1;i<=n;i++){+
            scanf("%s",s);//偷懒毁一生~ 
            p[i].a=init();
            p[i].b=init();
            p[i].c=init();
        }
        for(int i=1;i<=n;i++){
            now+=p[i].a-p[i-1].b-1;
            if(now-(p[i].b-p[i].a+1)*p[i].c+p[i].b-p[i].a+1>0)
                now=now-(p[i].b-p[i].a+1)*p[i].c+p[i].b-p[i].a+1;
            else{
                now=Cal(now+p[i].a*p[i].c-p[i].a-p[i].c+1,p[i].c-1);
                falg=1;break;
            }
        }
        if(falg)cout<<"Runtime Error"<<endl<<now<<endl;
        else cout<<"Accepted"<<endl<<now+1440-p[n].b<<endl;
        return 0;
    }
    View Code

    2.小猫爬山(catclimb.pas)

    题目描述

    Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。

    Freda和rainbow只好花钱让它们坐索道下山。索道上的缆车最大承重量为W,而N只小猫的重量分别是C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过W。每租用一辆缆车,Freda和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。

    这题有点失败....写了迭代了结果排序排反了

    考试时怎么就脑抽小的排在前面了呢 made不排序都比这样过得多....

    有个没想到的剪枝:每个猫i放到前i个车里

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 21
    using namespace std;
    int n,m,s,a[maxn],cnt,p=1,falg,c[maxn];
    int cmp(int a,int b){
        return a>b;
    }
    void Dfs(int now){
        if(now==n+1){
            falg=1;return;
        }
        for(int i=1;i<=s&&i<=now;i++){//剪枝 
            if(c[i]+a[now]<=m){
                c[i]+=a[now];
                Dfs(now+1);if(falg)return;
                c[i]-=a[now];
            }
        }
    }
    int main()
    {
        freopen("catclimb.in","r",stdin);
        freopen("catclimb.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+1+n,cmp);//大到小!这样规模小! 
        for(int i=1;i<=18;i++){
            memset(c,0,sizeof(c));
            s=i;Dfs(1);
            if(falg){
                cnt=i;break;
            }
        }
        printf("%d
    ",cnt);
        return 0;
    }
    View Code

    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命令中的食尸鬼是活着的

    输入数据中没有多余空格、换行

    离散化+线段树 正常画风

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 100010
    #define lc k*2
    #define rc k*2+1
    #define mid (l+r)/2
    using namespace std;
    int n,m,a[maxn],b[maxn],c[maxn],s[maxn*4],num;
    struct node{
        int x,y;
        char z;
    }p[maxn];
    int init(){
        int x=0,f=1;char s=getchar();
        while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x*f;
    }
    void Insert(int k,int l,int r,int x,int y){
        if(l==x&&r==x){
            s[k]+=y;return;
        }
        if(x<=mid)Insert(lc,l,mid,x,y);
        else Insert(rc,mid+1,r,x,y);
        s[k]=s[lc]+s[rc];
    }
    int Query(int k,int l,int r,int x){
        if(l==r)return l;
        if(x>s[lc])return Query(rc,mid+1,r,x-s[lc]);
        else return Query(lc,l,mid,x);
    }
    int main()
    {
        freopen("war.in","r",stdin);
        freopen("war.out","w",stdout);
        n=init();
        for(int i=1;i<=n;i++){
            a[i]=init();
            b[i]=a[i];c[++num]=a[i];
        }
        m=init();
        for(int i=1;i<=m;i++){
            cin>>p[i].z;p[i].x=init();
            if(p[i].z!='Q')p[i].y=init();
            if(p[i].z=='A'){
                b[p[i].x]-=p[i].y;
                if(b[p[i].x]>0)c[++num]=b[p[i].x];
            }
            if(p[i].z=='C'&&b[p[i].x]>0){
                b[p[i].x]+=p[i].y;
                c[++num]=b[p[i].x];
            }
        }
        sort(c+1,c+1+num);
        int pos,X,Y;
        num=unique(c+1,c+1+num)-c-1;
        for(int i=1;i<=n;i++){
            pos=lower_bound(c+1,c+1+num,a[i])-c;
            Insert(1,1,num,pos,1);
        }
        for(int i=1;i<=m;i++){
            if(p[i].z=='Q'){
                if(s[1]<p[i].x){
                    printf("-1
    ");continue;
                }
                pos=Query(1,1,num,s[1]-p[i].x+1);
                printf("%d
    ",c[pos]);
            }
            if(p[i].z=='A'){
                X=a[p[i].x];a[p[i].x]-=p[i].y;
                pos=lower_bound(c+1,c+1+num,X)-c;
                Insert(1,1,num,pos,-1);
                Y=a[p[i].x];if(Y<=0)continue;
                pos=lower_bound(c+1,c+1+num,Y)-c;
                Insert(1,1,num,pos,1);
            }
            if(p[i].z=='C'){
                X=a[p[i].x];if(X<=0)continue;
                a[p[i].x]+=p[i].y;
                pos=lower_bound(c+1,c+1+num,X)-c;
                Insert(1,1,num,pos,-1);
                Y=a[p[i].x];
                pos=lower_bound(c+1,c+1+num,Y)-c;
                Insert(1,1,num,pos,1);
            }
        }
        printf("%d
    ",s[1]);
        return 0;
    }
    View Code

    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范围内

     考试四个题 时间不够了最后十分钟大个暴力10分

    下午过来15分钟打完正解QAQ

    背包+路径输出

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #define maxn 5010
    using namespace std;
    int n,m,f[maxn][maxn/10],p[maxn],path[maxn];
    vector<int>c[maxn],v[maxn];
    int init(){
        int x=0,f=1;char s=getchar();
        while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x*f;
    }
    void Dfs(int x,int y){
        if(x<=0)return;
        for(int i=0;i<=p[x];i++)
            if(f[x][y]==f[x-1][y-c[x][i]]+v[x][i]){
                path[x]=i+1;Dfs(x-1,y-c[x][i]);
            }
    }
    int main()
    {
        freopen("diablo.in","r",stdin);
        freopen("diablo.out","w",stdout);
        n=init();m=init();
        int ci,vi;
        for(int i=1;i<=n;i++){
            ci=init();p[i]=init();
            for(int j=1;j<=p[i];j++){
                vi=init();
                c[i].push_back(ci*j);
                v[i].push_back(vi);
            }
            c[i].push_back(0);
            v[i].push_back(0);
        }
        for(int i=1;i<=n;i++)
            for(int j=m;j>=0;j--){
                int s=c[i].size();
                f[i][j]=f[i-1][j];
                for(int k=0;k<s;k++)
                    if(j>=c[i][k])
                        f[i][j]=max(f[i][j],f[i-1][j-c[i][k]]+v[i][k]);
            }
        printf("%d
    ",f[n][m]);
        Dfs(n,m);
        for(int i=1;i<=n;i++)
            printf("%d
    ",path[i]%(p[i]+1));
        return 0;
    }
    View Code
  • 相关阅读:
    2.2.3 线程中断
    java枚举 用于声明持久化常量 和volley 请求头
    java获取昨天的日期
    使用LocalBroadcastManager
    大端模式与小端模式
    Android更新主线程UI的两种方式handler与runOnUiThread()
    android dialog圆角显示及解决出现的黑色棱角.(友情提示)
    html5中的新标签
    html中的title和alt
    Android开发之蓝牙Socket
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5949155.html
Copyright © 2011-2022 走看看