关于Algorithm IO3模拟赛的总结

来源:互联网 发布:50道js经典逻辑题 编辑:程序博客网 时间:2024/06/06 10:07

  • T1 东东取礼物giftccpp
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例输入
    • 样例输出
    • 数据范围与约定
    • 初代码
      • 初分数
    • 改代码
    • 经历
    • 感想改进
  • T2作业排序taskcppc
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例输入
    • 数据范围与约定
    • 初代码
      • 初分数
    • 改代码
    • 经历
      • 正解是贪心
    • 感想改进
  • 东东跑步 runcppc
    • 问题描述
    • 输入格式
    • 输出格式
    • 样例输入
    • 样例输出
    • 数据范围与约定
    • 经历
    • 代码
  • 总结

T1 东东取礼物(gift.c/.cpp)

题目描述

输入格式

过中秋节了,东东爸 也准备了礼物要给东东——money。当然礼物不是money那么俗气,因为东东爸答应,用东东 拿到的所有money去超市买成东东最喜欢的糕糕。(为什么中秋节不买月饼,因为东东偏爱糕糕多一些)。东东爸 也给东东 制造了困难, 不能那么容易就让东东 得到这些money。顺便也让东东 动动脑筋,长大以后才能聪明嘛!
东东爸 把money分成N份,放到N层的书架上,每层可能有0条、1条或者多条连接线连接比当前层低的某层。任意选择一层开始,只能沿着当前层的某条连接线走向下面的某层,到达这一层后,这层的money才能得到。也就是如果拿了一层的money后,就可以顺着连接线向下层去拿那层的money,直到没有连接线停止。
东东当然聪明无比,一下就拿到了最多的money。你能行么?

输出格式

只有一个正整数,表示东东 可能拿到的最多的money。

样例输入

312 2 32030

样例输出

42

数据范围与约定

N<=100 , 1<=xi<=10000

初·代码

#include <iostream>#include <cstdio>#include <queue>#include <algorithm>using namespace std;struct p{    int from;    int to;}qwe[6000];int numdot,longpath[110],done[110],ip=0,ans=0,money,a,map[110][110];char inp;void dijkstra(){    memset(longpath,0,sizeof(longpath));    memset(done,0,sizeof(done));    int temp,workdot;    for(int i=0;i<=numdot;i++)    {        temp=-1;        for(int j=0;j<=numdot;j++)            if(longpath[j]>temp&&done[j]==0) temp=longpath[j],workdot=j;        done[workdot]=1;        for(int j=0;j<=numdot;j++)            if(map[workdot][j]+longpath[workdot]>longpath[j]&&map[workdot][j])                longpath[j]=map[workdot][j]+longpath[workdot];    }}int main(){    freopen("gift.in","r",stdin);    freopen("gift.out","w",stdout);    int numpath=0;    scanf("%d%c",&numdot,&inp);    while(ip<numdot)    {        scanf("%d",&a);        if(inp=='\n')        {            ip++;            map[0][ip]=a;            money=a;        }else        {            qwe[++numpath].from=ip;            qwe[numpath].to=a;        }        scanf("%c",&inp);    }    for(int i=1;i<=numpath;i++)    {        map[qwe[i].from][qwe[i].to]=map[0][qwe[i].to];    }    dijkstra();    for(int i=1;i<=numdot;i++)    {        if(longpath[i]>ans)        ans=longpath[i];     }    printf("%d",ans);    return 0;    fclose(stdin);    fclose(stdout);}

初·分数

0(WA)

改·代码

#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <algorithm>using namespace std;int Numdot,map[110][110],path[10010][3],Numpath=0;char reader[1000];int main(){    freopen("gift.in","r",stdin);    freopen("gift.out","w",stdout);    int ans=0;    cin>>Numdot;    gets(reader);    for(int i=1;i<=Numdot;i++)    {        gets(reader);        int Makenum=0,Numnum=1;        int len=strlen(reader);        for(int temp=0;temp<=len;temp++)        {            if(reader[temp]!=' '&&temp<len)                Makenum=Makenum*10+reader[temp]-'0';            else            {                if(Numnum==1)                {                    map[0][i]=Makenum;                }                else                {                    path[++Numpath][1]=i;                    path[Numpath][2]=Makenum;                }                Numnum++;                Makenum=0;            }        }    }    for(int i=1;i<=Numpath;i++)    {        map[path[i][1]][path[i][2]]=map[0][path[i][2]];    }    for(int k=0;k<=Numdot;k++)        for(int i=0;i<=Numdot;i++)            for(int j=0;j<=Numdot;j++)                if(map[i][k]&&map[k][j])                    map[i][j]=max(map[i][j],map[i][k]+map[k][j]);    for(int i=0;i<=Numdot;i++)            for(int j=0;j<=Numdot;j++)                ans=max(ans,map[i][j]);    cout<<ans;    fclose(stdin);    fclose(stdout);    return 0;}

经历

今天脸黑,早上电脑开机一会死机黑屏,换的电脑又死机。读完题发现是个裸图论题,码完dijkstra,发现读图有错误,感觉gets太麻烦,就用是scanf分别读数和空格,在图底加一个虚点,把dijkstra码完。发现又不对,就把虚点放到图顶,再改dijkstra……
最后代码极丑无比,有好多我都不记得是什么的变量——————————->报零
然而正解是floyd(ˉ▽ˉ;)…

感想&改进

    算法要想好再码;    代码要想好再码;    题意要读懂再码。

T2作业排序(task.cpp/.c)

题目描述

东东幼儿园的作业非常繁重,为了能让孩子赢在起跑线上,幼儿园的各科老师在十一假期给学生留了很多的各种各样的作业,比如说扫地一次,洗碗一次,数字2写一篇,打球一次等等,并且有很多作业是要在老师规定的截止时间前在网络上提交的。
现在假定一共有N个作业,因为每个作业对于东东来说难度都不大,所以东东都可以在一个单位时间内完成,并且东东每个单位时间只能做一门作业,每个作业有一个最晚完成时间di(0

输入格式

第一行N,表示一共有N个作业。接下来的N行,每行两个数di 和wi,di为正整数,wi为浮点数。

输出格式

    一行一个正整数,表示获得的最大的重要程度和,保留2为小数。

样例输入

32 1.11 4.02 3.1

数据范围与约定

对于100%的数据有:1<=N<=100001<=M<=100000<wi<10000

初·代码

#include <iostream>#include <cstdio>#include <queue>#include <algorithm>using namespace std;priority_queue <double> q;int tasks;double ans=0;struct o_O{    int finaltime;    double importance;}qwe[10010];int cmp(o_O a,o_O b){    if(a.finaltime>b.finaltime)    {        return 0;    }else if(a.finaltime==b.finaltime)    {        if(a.importance>b.importance)            return 1;        else return 0;    }else    {        return 1;    }   }int main(){    freopen("task.in","r",stdin);    freopen("task.out","w",stdout);    scanf("%d",&tasks);    for(int i=1;i<=tasks;i++)        scanf("%d%lf",&qwe[i].finaltime,&qwe[i].importance);    sort(qwe+1,qwe+tasks+1,cmp);    for(int i=1;i<=tasks;i++)    {        if(qwe[i].finaltime!=qwe[i-1].finaltime)            q.push(qwe[i].importance);        else            if(q.top()<qwe[i].importance)            {                q.pop();                q.push(qwe[i].importance);            }    }    while(q.size())    {        ans+=q.top();        q.pop();    }    printf("%.2lf",ans);    return 0;    fclose(stdin);    fclose(stdout);}

初·分数

0(WA)

改·代码

#include <iostream>#include <cstdio>#include <queue>#include <algorithm>using namespace std;priority_queue <double> q;int tasks;double ans=0;struct o_O{    int finaltime;    double importance;}qwe[10010];int cmp(o_O a,o_O b){    if(a.finaltime>b.finaltime)    {        return 0;    }else if(a.finaltime==b.finaltime)    {        if(a.importance>b.importance)            return 1;        else return 0;    }else    {        return 1;    }   }int main(){    freopen("task.in","r",stdin);    freopen("task.out","w",stdout);    int available=0;    scanf("%d",&tasks);    for(int i=1;i<=tasks;i++)        scanf("%d%lf",&qwe[i].finaltime,&qwe[i].importance);    sort(qwe+1,qwe+tasks+1,cmp);    for(int i=1;i<=tasks;i++)    {        if(i==1)        {            q.push(-qwe[i].importance);            continue;        }        available=qwe[i].finaltime-q.size();        if(available)        {            q.push(-qwe[i].importance);            available--;        }           else            if(-q.top()<qwe[i].importance)            {                q.pop();                q.push(-qwe[i].importance);            }    }    while(q.size())    {        ans-=q.top();        q.pop();    }    printf("%.2lf",ans);    fclose(stdin);    fclose(stdout);    return 0;}

经历

这题最开始认为是大水。
但是!!!读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T读错题了!!!T_T
发现是个不怎么水的题。放下,写下一个水DP,码完DP后就对这题发呆,直到最后10分钟发现可以用STL堆做,记得我上一次写堆是去年的冬天,一阵码后调了一遍样例过了就交了—————>报零*2
闹心……

正解是贪心!!!!

但我把我的堆简单改了改也A了,不知道是不是解法

感想&改进

要提高码力宜码代码忌扯犊子

东东跑步 (run.cpp/.c)

问题描述:

最近东东迷上了跑步,但是他却不知道自己能跑多远,需要你的帮忙。
已知东东一共有N分钟的时间,每分钟他可以run或者rest。若他在第i分钟run,可以跑出di米,同时疲劳度增加1(初始为0)。若他在第i分钟休息,则疲劳度减少1。无论何时,疲劳度都不能超过M。另外,一旦他开始休息,只有当疲劳度减为0时才能重新开始run。在第N分钟后,他的疲劳度必须为0。

输入格式

第一行两个整数N和M接下来N行每行一个整数,代表di。

输出格式

输出东东最远跑的距离。

样例输入

5 2534210

样例输出

9

数据范围与约定

对于 100% 的数据,保证 N≤2000 ,M<=500 , 0<di<=1000

经历

写一写,码一码------->90(有一点没数据)(AC)

代码

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int f[2010][600],length[2010];int main(){    freopen("run.in","r",stdin);    freopen("run.out","w",stdout);    int time,tire;    cin>>time>>tire;    for(int i=1;i<=time;i++)        scanf("%d",&length[i]);    for(int i=1;i<=time;i++)    {        int ma;        if(i<tire)            ma=i;        else ma=tire;        for(int j=0;j<=ma;j++)        {            if(j!=0)                f[i][j]=f[i-1][j-1]+length[i];            if(j==0)            {                int an=0;                for(int k=i-1;k>=1;k--)                {                    an=max(an,f[k][i-k]);                }                an=max(an,f[i-1][j]);                f[i][j]=an;            }        }    }    cout<<f[time][0]<<endl;    fclose(stdin);    fclose(stdout);    return 0;}

总结

这次考试总体不好,第一题,第二题其实可以A(以现在的数据)
但是因为花式读错题+弱弱的码力所以只有第三题码力需求为零的 DP A了
还把fclose写到return后面
我也是醉了<@_@>

0 0