BestCoder#27两道水题 HDU5162&&5163

来源:互联网 发布:软件功能说明书模板 编辑:程序博客网 时间:2024/06/05 23:42

= = 好久没做题了,又是准备期末考试(OS概念太多。。。),晚上休息的时候又一直在迷之看历史转折中的邓小平= = ,忘了BC,刚刚看完了就看了下今天的BC过题术,然后把前两题水过了,第一题:

Jump and Jump...


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 714    Accepted Submission(s): 422


问题描述
n小孩在比赛跳远,看谁跳的最远。每个小孩可以跳3次,这个小孩的成绩就是三次距离里面的最大值。例如,一个小孩跳3次的距离分别时10, 30和20,那么这个小孩的成绩就是30。给出每个孩子三次跳的距离,问最终每个孩子的排名是多少。
输入描述
输入文件的第一行有一个整数T (1T100),表示测试数据的组数。对于每组测试数据:第一行包括一个整数n (2n3), 表示孩子的数目. 接下来n行, 每行包含三个整数ai,bici (1ai,bi,ci,300), 表示第i个小孩每次的跳的距离。输入数据保证每个孩子的成绩互不相同。
输出描述
对于每组数据,输出一行包含n个整数,用一个空格隔开。第i个数表示第i个小孩的最终名次。
输入样例
2310 10 1010 20 3010 10 2023 4 11 2 1
输出样例
3 1 21 2提示:对于第一组数据,3个孩子的成绩分别时10, 20和30。因此他们最终排名依次是3, 1和2.
数据量小成马,一开始想开结构体,一个记录最高分,一个记录当前排名,发现不需要,只要记录最高分,然后两重循环枚举几个人比当前得分高OK输出就行了。

#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;int main(){    int t;    cin>>t;    while(t--)    {        int n;        cin>>n;        int d[10];        int a,b,c;        for(int i=0;i<n;i++)        {                cin>>a>>b>>c;                d[i]=max(a,max(b,c));        }        for(int i=0;i<n;i++)        {            int rk=0;            for(int j=0;j<n;j++)            {                if(d[j]>=d[i])                {                    rk++;                }            }              if(i==n-1)              {                  cout<<rk<<endl;              }              else              {                  cout<<rk<<" ";              }        }    }    return 0;}

第二题:

Taking Bus


Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 954    Accepted Submission(s): 213


问题描述
Bestland有一条非常长的马路,马路上设有n个公交汽车站。公交汽车站从左到右标号为1到n。有m个人想要乘公交。你的任务是找出每个人到终点为止所需要的时间。注意:你需要用来解决这道题目的信息在Input里面,请仔细阅读。
输入描述
输入的第一行包含一个整数T (1T60),表示测试数据的组数。对于每组测试数据:第一行包含两个整数nm (2n,m105),表示公交车站的数目和乘客的数目。 接下来一行包含n1个整数, d1,d2,,dn1 (1di109).  di表示第i个公交站和第i+1个公交站之间的距离。在接下来的m行, 每行包含两个整数xiyi (1xi,yin,xiyi), 表示第i个人时刻0的时候在第xi个公交站并且想要到第yi个公交站去。(1im)对于第i个人, 公交车在第((i1) mod n)+1个公交站点在时刻0的时候,并且公交一开始往右开。公交到达站点n的时候会立刻转向往左开,同样当公交到达站点1的时候也会立刻转向往右开。你可以认为公交每秒只开一个单位距离,你只需要考虑公交开的时间。
输出描述
对于每个人,输出到达yi个公交站点需要的最少时间。
输入样例
17 32 3 4 3 4 51 74 55 4
输出样例
211028提示:对于第一个人, 公交在站点1出发, 然后这个人在时刻0上车。21秒之后,公交到达站点7。对于第二个人,公交在站点2出发。7秒之后,公交到达站点4,这个人上车。之后又过了3秒,公交到达站点5.总共用了10秒。对于第三个人,公交在站点3出发。7秒之后,公交到达站点5,这个人上车。之后过了9秒,公交达到站点7,然后转向开往站点0。之后经过12秒,公交达到站点4。因此总共需要28秒时间。
情况多了一点,要分公交车出发的起点和该人的起始站和终点站来分类讨论。

大致按照起始站和公交车的起点的大小分成两大类,两大类里面再分起始站和终点站的位置来考虑,6种情况。。。

第一大类:

公交车起点站s<=x则有:

s<=x<y

s<=y<x

y<s<x

第二大类同理:

x<s<y

x<y<=s

y<x<=s

然后画个图模拟一下就好了- -

然后一开始脑残想暴力去O(NM)的直接算,看了下数据妥妥T,然后稍微处理了一下前缀和就OK了- -

数据量比较大,我一看到就全场long long了,无脑1A。。。。

都不难但是好久没敲,脑子又生锈了。。。。

#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;long long n,m;long long d[100005];long long dis[100005];long long x,y;long long s;long long  t;long long slove(long long x,long long y,long long s){    long long res=0;    if(s<=x)    {        res+=dis[x]-dis[s];        if(x<=y)        {            res+=dis[y]-dis[x];        }        else        {            res+=2*dis[n]-dis[x]-dis[y];        }    }    else    {       res+=dis[n]-dis[s]+dis[n]-dis[x];       if(y<=x)       {           res+=dis[x]-dis[y];       }       else       {           res+=(dis[x]-dis[0])+(dis[y]-dis[0]);       }    }    return res;}int  main(){    cin>>t;    while(t--)    {        cin>>n>>m;        for(long long  i=1;i<n;i++)        {            cin>>d[i];        }        dis[1]=0;        for(long long  i=2;i<=n;i++)        {            dis[i]=dis[i-1]+d[i-1];        }        for(long long  i=1;i<=m;i++)        {            cin>>x>>y;            cout<<slove(x,y,(i-1)%n+1)<<endl;        }    }    return 0;}


0 0
原创粉丝点击