2016年春季大学先修课考试

第一次参加,哎,就当做积累经验了。

今年的题要比去年的难,难,难一些。

看题吧,,,,

A:跳绳游戏

描述
小朋友玩跳绳比赛,要计算在一分钟内跳了多少下.假设每秒钟跳一下,如果中途失败了,则要花三秒钟后才能开始重跳.一般小朋友跳绳一分钟要跳坏好几次.现在给出小朋友每次跳坏时已经跳的总数,求小朋友在一分钟内跳了多少下.(请注意分析示例数据.)
输入
第一行为n个小朋友
其余各行,每行第一个整数是跳坏的次数m,其余m个整数是跳坏时累计跳了多少下.
输出
输出相应小朋友头一分钟内跳了多少下.
样例输入
6
0
3 12 23 45 
1 17
4 10 20 30 40
5 10 20 30 40 58 
6 10 20 30 40 47 60
样例输出
60
51
57
48
48
47
提示
提示,在跳绳比赛时,你可能已经超时了,但自己还在计数,但裁判已经停止计时并得到成绩了.这里相当与自己计数.因此,并非跳坏的时候都是在前一分钟以内.请注意分析示例数据.
/*
这题纯模拟,然而我没做出来 
维护一个t表示当前时间,一个ans为当前的个数,一个s表示累计罚时
无非就是判断t是否超过60
但我却傻啦吧唧的 break 了 导致一部分数据没有输进去  死活调不出来 
*/
#include<iostream>
using namespace std;
int n,m,a[10001];
int main()
{
    cin>>n;
    int k,i,j;
    for(k=1;k<=n;k++)
      {
          cin>>m;
          int s=0,t=0,ans=0,f=0,g=0;
          for(i=1;i<=m;i++)
            {
                cin>>a[i];
                if(g==1)continue;
            if(a[i]+s<=60)
              {
                  ans=a[i];
                  f=1;
              }
                else 
                  {
                      g=1;
                      continue;
              }
                t=a[i]+s;
            s=s+3;
          }
        if(m&&f)t=t+3;
        if(t<60)
          ans=ans+60-t;
        cout<<ans<<endl;
      }
}

 

B:13号统计

描述

写一个程序,要求计算一个时间段内每个月的13号落在周一到周日的次数。给定N,要求计算1900年1月1日至1900+N-1年12月31日中十三号分别落在星期六,星期日,星期一,…星期五的次数,N为正整数且不大于400. 

输入
一个正整数N. 1 <= N <= 400.
输出
七个在一行以一个空格分开的整数,它们代表13日是星期六,星期日,星期一...星期五的次数.
样例输入
20
样例输出
36 33 34 33 35 35 34
提示
1. 1900年1月1日是星期一,1900年1月13日是星期六
2. 注意闰年
/*
这题不说啥了
话说 3200年好像不是闰年..... 
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,g,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},ans[8];
int main()
{
    cin>>n;
    int i,j,s=0;
    for(i=1900;i<=1900+n-1;i++)
      {
          if(i%4==0&&i%100!=0||(i%400==0))g=1;
          else g=0;
          for(j=1;j<=12;j++)
            {
                ans[(s+13)%7]++;
                if(g==1&&j==2)s=s+29;
                else s=s+a[j];
          }
      }
    cout<<ans[6]<<" "<<ans[0]<<" ";
    for(i=1;i<=5;i++)cout<<ans[i]<<" ";
    return 0;
}

C:区间合并

描述

给定 n 个闭区间 [ai; bi],其中i=1,2,...,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3],[1;3] 和 [2;4] 可以合并为 [1;4],但是[1;2] 和 [3;4] 不可以合并。

我们的任务是判断这些区间是否可以最终合并为一个闭区间,如果可以,将这个闭区间输出,否则输出no。

输入
第一行为一个整数n,3 ≤ n ≤ 50000。表示输入区间的数量。
之后n行,在第i行上(1 ≤ i ≤ n),为两个整数 ai 和 bi ,整数之间用一个空格分隔,表示区间 [ai; bi](其中 1 ≤ ai ≤ bi ≤ 10000)。
输出
输出一行,如果这些区间最终可以合并为一个闭区间,输出这个闭区间的左右边界,用单个空格隔开;否则输出 no。
样例输入
5
5 6
1 5
10 10
6 9
8 10
样例输出
1 10
/*
这题 最蛋疼了
一眼题 结果wa了好几次
sort 一遍 先按l 后按r 
然后for一遍 然而这样 
3
1 10
2 5
7 8
这组数据就wa掉了
所以.....维护一个ri 表示目前的最右端点 
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 500010
#define inf 1000000
using namespace std;
int n,ll=inf,rr,ri;
struct node
{
    int l;
    int r;
}a[maxn];
int cmp(const node& x,const node &y)
{
    if(x.l<y.l)return 1;
    if(x.l>y.l)return 0;
    else 
      {
          if(x.r<y.r)return 1;
          else return 0;
      }
}
int main()
{
    cin>>n;
    int i,j;
    for(i=1;i<=n;i++)
      {
          cin>>a[i].l>>a[i].r;
          ll=min(ll,a[i].l);
          rr=max(rr,a[i].r);
      }
    sort(a+1,a+1+n,cmp);
    ri=a[1].r;
    for(i=2;i<=n;i++)
      if(ri<a[i].l)
        {
          cout<<"no";
          return 0;
        }
      else ri=max(ri,a[i].r);
    cout<<ll<<" "<<rr;
}

D:细菌实验分组

描述

有一种细菌分为A、B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱。在一次为时一个 小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组。

输入
输入有多行,第一行为整数n(n≤100),表示有n个培养皿。
其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。
输出
输出有多行:
第一行输出A亚种培养皿的数量,其后每行输出A亚种培养皿的编号,按繁殖率升序排列。
然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。
样例输入
5
1 10 3456
2 10 5644
3 10 4566
4 20 234
5 20 232
样例输出
3
1
3
2
2
5
4
提示
亚种内部,细菌繁殖能力差异远远小于亚种之间细菌繁殖能力的差异。
也就是说,亚种间任何两组细菌的繁殖率之差都比亚种内部两组细菌的繁殖率之差大。
/*
这题,,,考试做题顺序不对
这道题没留时间 ╮(╯▽╰)╭ 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,power,k;
struct node
{
    int o;
    int q,p;
    double pow,part;
}a[110];
int cmp(const node &x,const node &y)
{
    if(x.pow<y.pow)return 1;
    else return 0;
}
int main()
{
    cin>>n;
    int i,j;
    for(i=1;i<=n;i++)
      {
          cin>>a[i].o>>a[i].q>>a[i].p;
          a[i].pow=double(a[i].p-a[i].q)/double(a[i].q);
      }
    sort(a+1,a+1+n,cmp);
    for(i=2;i<=n;i++)
      if(a[i].pow-a[i-1].pow>power)
        {
          k=i;
          power=a[i].pow-a[i-1].pow;
        }
    k--;
    cout<<n-k<<endl;
    for(i=k+1;i<=n;i++)cout<<a[i].o<<endl;
    cout<<k<<endl;
    for(i=1;i<=k;i++)cout<<a[i].o<<endl;
    return 0;
}

E:好人坏人

描述

小朋友们在玩游戏:2k个小朋友围成一个圈,标号依次从1到2k,其中k个扮演好人,另k个扮演坏人。游戏规则如下:从第一个小孩开始报数,报到m时,第m个小孩被踢出,然后从下一个小孩开始,重复前面的过程,直到还剩下k个小孩,停止踢人。我们希望被踢出的都是坏人。已知前k个是好人,后k个是坏人,现在要求你对于每一个k,确定一个最小的正整数m,使得按游戏规则踢出的k个孩纸都是坏人。 

输入
输入有多行,每行一个非负整数k,k不大于13。若输入为0,则标志着输入结束。
输出
于每一个正整数k,输出最小的m
样例输入
1
4
0
样例输出
2
30
/*
这题考试没时间写了
事后写了个还TLE了.....
约瑟夫环写得丑 O(mn) 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1010
using namespace std;
int a[maxn],ans[maxn],size,n,m,num,p,k=1;
int main()
{
    while(1)
    {
      cin>>n;
      int ff=0;
      if(n==0)break;
      n=n*2;
      for(m=1+n/2;;m++)
      {
          memset(ans,0,sizeof(ans));
          num=0;p=0;k=1;size=0;
        a[n]=1;
        for(int i=1;i<n;i++)a[i]=i+1;
        p=n;
        int fi=0;
        while(num<n/2)
          {
              while(k<m)
               {
                  p=a[p];
                  k++;
              }
            ans[++size]=a[p];
            if(a[p]<=n/2)
              {
                fi=1;
                break;
              }
            num++;
            a[p]=a[a[p]];
            k=1;
          }
        if(fi==0)
          {
              cout<<m<<endl;
              break;
          }
        }
    }
    return 0;
}
/*
后来0.0 看了wmy大神的 
p 杀掉一部分人之后 ni时的 被杀的那个的编号 
*/
#include<iostream>
#include<cstdio>
using namespace std;
int k,n,m,p;
int main()
{
    while(1)
      {
          cin>>k;
          if(k==0)break;
          for(m=k+1;m;m++)
            {
                p=0;n=k*2;
                int f=0;
                for(int i=1;i<=k;i++)
                  {
                      p=(p+m-1)%n;
                      if(p<k)f=1;
                      n--;
              }
            if(f==0)
              {
                  cout<<m<<endl;
                  break;
              }
          }
      }
}

F:人工智能

描述

人工智能一直是计算机学所追求的一个很高的境界,全世界的计算机学家们至今仍在不断努力力求达到这个境界。 
这道题也跟“人工智能”有关。 
学过初中物理的同学都应该知道物理学中的这个公式P(功率)= U(电压)* I(电流)。如果给定其中的任意两个值,第三个值都是很容易求的,这个就是本题的任务。

输入
既然是人工智能,不要妄想题目会直接告诉你其中的某两个值。 
输入的第一行是一个整数,表示有多少组测试数据。以下每一行是一组测试数据,分别为一句英文句子。你需要从中识别已知和未知,并且求出未知量。需要说明的是,句子中I,U,P三个物理量中已知的两个一定会以I=xA, U=xV,P=xW这样的样式给出(注意单位以及大小写)。在这样的表达式中,可能会在单位(A,V,W)的前面出现表示数量级的字母m、k、M,分别表示毫,千,兆。
输出
对于每一组数据,按以下格式输出三行: 
首先输出"Problem #k",k表示当前是第k组测试数据。 
然后在下一行输出结果,结果要求单位必须为A,V或者W,并且保留两位小数。 
最后再输出一个空行。 
具体可以参见样例输出。
样例输入
3
If the voltage is U=200V and the current is I=4.5A, which power is generated?
A light-bulb yields P=100W and the voltage is U=220V. Compute the current, please.
bla bla bla lightning strike I=2A bla bla bla P=2.5MW bla bla voltage?
样例输出
Problem #1
P=900.00W

Problem #2
I=0.45A

Problem #3
U=1250000.00V

提示
提示:数字后面的m、k、M,分别代表0.001, 1000,1000000. 
例如:2m = 2 * 0.001
/*
考场上我竟然不做那些模拟题来做这恶心的字符串
结果还没做对.....
小数点处理的少了一句话
其他的 不多说了 
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000001
using namespace std;
int n;
double p,q,x,f;
char s[maxn];
int main()
{
    cin>>n;
    gets(s);
    int i,j;
    for(i=1;i<=n;i++)
      {
          gets(s);
          f=1;
          int a=-1,b=-1,c=-1,l=strlen(s);
          for(j=0;j<=l-1;j++)if(s[j]=='P'&&s[j+1]=='=')a=j;
          for(j=0;j<=l-1;j++)if(s[j]=='U'&&s[j+1]=='=')b=j;
          for(j=0;j<=l-1;j++)if(s[j]=='I'&&s[j+1]=='=')c=j;
          if(a>=0&&b>=0)
            {
                j=a;
                double g=1;
              x=0;
              j=j+2;
                f=1;
                while(s[j]>='0'&&s[j]<='9'||s[j]=='.')
                  {
                      if(s[j]=='.')
                  {
                      f=f/10;j++;
                    continue;
                  }
                if(f==1)
                      x=x*10+s[j]-'0';
                      else 
                  {
                      x=x+(s[j]-'0')*f;
                      f=f/10;
                  } 
                      j++;
              }
            if(s[j]=='m')g=0.001;
                if(s[j]=='k')g=1000;
                if(s[j]=='M')g=1000000;
                if(g!=1)j++;
                p=x*g;
                j=b;
                g=1;
              x=0;
              j=j+2;
                f=1;
                while(s[j]>='0'&&s[j]<='9'||s[j]=='.')
                  {
                      if(s[j]=='.')
                  {
                      f=f/10;j++;
                    continue;
                  }
                if(f==1)
                      x=x*10+s[j]-'0';
                      else 
                  {
                      x=x+(s[j]-'0')*f;
                      f=f/10;
                  } 
                      j++;
              }
            if(s[j]=='m')g=0.001;
                if(s[j]=='k')g=1000;
                if(s[j]=='M')g=1000000;
                if(g!=1)j++;
                q=x*g;
                printf("Problem #%d\nI=",i);
                printf("%.2fA\n",p/q);
          }
        if(a>=0&&c>=0)
            {
                double g;
                j=a;
              x=0;
              j=j+2;
                f=1;
                while(s[j]>='0'&&s[j]<='9'||s[j]=='.')
                  {
                      if(s[j]=='.')
                  {
                      f=f/10;j++;
                    continue;
                  }
                if(f==1)
                      x=x*10+s[j]-'0';
                      else 
                  {
                      x=x+(s[j]-'0')*f;
                      f=f/10;
                  } 
                      j++;
              }
            if(s[j]=='m')g=0.001;
                if(s[j]=='k')g=1000;
                if(s[j]=='M')g=1000000;
                if(g!=1)j++;
                p=x*g;
                j=c;
                g=1;
              x=0;
              j=j+2;
                f=1;
                while(s[j]>='0'&&s[j]<='9'||s[j]=='.')
                  {
                      if(s[j]=='.')
                  {
                      f=f/10;j++;
                    continue;
                  }
                if(f==1)
                      x=x*10+s[j]-'0';
                      else 
                  {
                      x=x+(s[j]-'0')*f;
                      f=f/10;
                  } 
                      j++;
              }
            if(s[j]=='m')g=0.001;
                if(s[j]=='k')g=1000;
                if(s[j]=='M')g=1000000;
                if(g!=1)j++;
                q=x*g;
                printf("Problem #%d\nU=",i);
                printf("%.2fV\n",p/q);
          }
        if(b>=0&&c>=0)
            {
                j=b;
                double g=1;
              x=0;
              j=j+2;
                f=1;
                while(s[j]>='0'&&s[j]<='9'||s[j]=='.')
                  {
                      if(s[j]=='.')
                  {
                      f=f/10;j++;
                    continue;
                  }
                if(f==1)
                      x=x*10+s[j]-'0';
                      else 
                  {
                      x=x+(s[j]-'0')*f;
                      f=f/10;
                  } 
                      j++;
              }
            if(s[j]=='m')g=0.001;
                if(s[j]=='k')g=1000;
                if(s[j]=='M')g=1000000;
                if(g!=1)j++;
                p=x*g;
                j=c;
                g=1;
              x=0;
              j=j+2;
            f=1;
                while(s[j]>='0'&&s[j]<='9'||s[j]=='.')
                  {
                      if(s[j]=='.')
                  {
                      f=f/10;j++;
                    continue;
                  }
                if(f==1)
                      x=x*10+s[j]-'0';
                      else 
                  {
                      x=x+(s[j]-'0')*f;
                      f=f/10;
                  } 
                      j++;
              }
            if(s[j]=='m')g=0.001;
                if(s[j]=='k')g=1000;
                if(s[j]=='M')g=1000000;
                if(g!=1)j++;
                q=x*g;
                printf("Problem #%d\nP=",i);
                printf("%.2fW\n",p*q);
          }
        cout<<endl;
      }
}

 

 

 

/*
最后两个题嘛
没来得及做  H是原题 太麻烦 来不及敲了
G通过率为0  看都没看直接.....
conclude一下这次的教训吧
1.做题速度慢啊慢 死慢死慢 大部分时间都早调代码 应该敲键盘之前先想清楚了再动手
2.顺序不对 而且很傻比 字符串题不要急着做 这次的这个考场上基本做出来了 但交了2次都wa掉了
  就没再看  既然都花了那么久敲完了 就一定要花些时间去检查 争取做一个对一个
3.心态不好 看着别人嗖嗖 的AAAA 自己就着急 越急越没思路 越没思路越急

总之吧 这次是个教训 不管是只是积累还是考场技巧上 都需要很大的提高 
*/
#include<cstdio>
using namespace std;
int main()
{
    printf("Frighting! We are all on the way. ^ ^")
 } 

 

posted @ 2016-04-17 19:22  一入OI深似海  阅读(1198)  评论(0编辑  收藏  举报