2018-2019赛季多校联合新生训练赛第六场(2018/12/15)补题题解

A 价钱统计(基础编程能力)

这个考点还是比较个性的,怎么四舍五入

解法

常规的讲如果四舍五入整数位的话,那么只需要在后面加个0.5然后强制转换一下就可以了

这个却要我们保留一位小数的四舍五入,那该怎么做呢

实际上我们只需要把这个数乘以10然后加0.5,强制转换后再除以10就可以了

代码

#include <bits/stdc++.h>
using namespace std;
double trans(double a)
{
  a*=10;
  a+=0.5;
  a=int(a);
  a/=10;
  return a;
}
int main()
{
  /*ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);*/
  double a,b,c,d;
  cin>>a>>b>>c>>d;
  double r1,r2,r3,r4,sum=0;
  r1=1.2*a;
  sum+=r1;
  r1=trans(r1);
  r2=3.5*b;
  sum+=r2;
  r2=trans(r2);
  r3=4.5*c;
  sum+=r3;
  r3=trans(r3);
  r4=5*d;
  sum+=r4;
  r4=trans(r4);
  sum=trans(sum);
  printf("%.1f\n%.1f\n%.1f\n%.1f\n%.1f",r1,r2,r3,r4,sum);
}

B 打印图形 (语法基础)

观察得到规律比如A

就是A

B

ABA

A

是不是发现有规律?这一行就是从A到这个数然后再逆向输出n-1项,如果是AB那么n=2逆向输出n=1的A加起来就是ABA

别忘记还有空格要打印

代码

#include <bits/stdc++.h>
using namespace std;
string st[1000];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  char c;
  cin>>c;
  int id=c-'A'+1;
  for(int i=1;i<=id;i++)
  {
    string t="",tt="",ttt="";
    for(int j=0;j<i;j++)
    t+='A'+j;
    for(int j=0;j<t.size()-1;j++)
    tt+=t[j];
    reverse(t.begin(),t.end());
    for(int j=0;j<id-i;j++)
    ttt+=' ';
    st[i]=ttt+t+tt;
  }
  for(int i=id;i>=0;i--)
  {
    cout<<st[i];
    if(i!=0)
    cout<<"\n";
  }
}

C 数列计算I(语法基础)

这里还要保留小数,我不知道需不需要真的保留,不过我是保留了。并且最后输出分式的时候要输出.%0f我两次wa就是因为最后double他科学计数了

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  /*ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);*/
  int n;
  cin>>n;
  double t1=4;
  double t2=7,sum=0;
  for(int i=0;i<n;i++)
  {
    sum+=t1/t2;
    double t3=t1;
    t1=t2;
    t2+=t3;
  }
  printf("%.0f/%.0f\n",t2-t1,t1);
  sum*=100;
  sum+=0.5;
  sum=int(sum);
  sum/=100;
  printf("%.2f",sum);
}

D 单词排序 (简单排序)

代码

#include <bits/stdc++.h>
using namespace std;
struct node
{
  string nm;
  int a,b,c,d;
}num[1000000];
bool cmp(node a,node b)
{
  return a.a+a.b+a.c+a.d>b.a+b.b+b.c+b.d;
}
string st[10000];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin>>n;
  for(int i=0;i<n;i++)
  cin>>st[i];
  sort(st,st+n);
  for(int i=0;i<n;i++)
  cout<<st[i]<<" ";
}

E 评奖(结构体排序)

代码

#include <bits/stdc++.h>
using namespace std;
struct node
{
  string nm;
  int a,b,c,d;
}num[1000000];
bool cmp(node a,node b)
{
  return a.a+a.b+a.c+a.d>b.a+b.b+b.c+b.d;
}
string st[10000];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin>>n;
  for(int i=0;i<n;i++)
  cin>>st[i];
  sort(st,st+n);
  for(int i=0;i<n;i++)
  cout<<st[i]<<" ";
}

F 计算比分(简单模拟)

首先分两种情况

①不是第五局

②是第五局

然后这两种情况的唯一区别是判断胜利的条件不同。不是第五局那么需要比分相差2且有一方已经大于等于25,是第五局那么只需要大于等于15

之后到达条件记录一下比分即可

代码

#include <bits/stdc++.h>
using namespace std;
struct node
{
  int a,b;
}jl[233];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  string a;
  cin>>a;
  int sa=0,sb=0,jx=0,ya=0,yb=0,p=0;
  for(int i=0;i<a.size();i++)
  {
    if(a[i]=='A')
    sa++;
    else if(a[i]=='B')
    sb++;
    if(jx<4)
    {
    if(sa>=sb+2&&sa>=25)
    {
      jl[p].a=sa;
      jl[p++].b=sb;
      sa=0;
      sb=0;
      ya++;
      jx++;
    }
    else if(sb>=sa+2&&sb>=25)
    {
      jl[p].a=sa;
      jl[p++].b=sb;
      sa=0;
      sb=0;
      yb++;
      jx++;
    }
  }
  else
  {
    if(sa>=sb+2&&sa>=15)
    {
      jl[p].a=sa;
      jl[p++].b=sb;
      sa=0;
      sb=0;
      ya++;
      jx++;
    }
    else if(sb>=sa+2&&sb>=15)
    {
      jl[p].a=sa;
      jl[p++].b=sb;
      sa=0;
      sb=0;
      yb++;
      jx++;
    }
  }
    if(ya==3||yb==3)
    break;
  }
  ya>yb?cout<<"A\n":cout<<"B\n";
  for(int i=0;i<p;i++)
  cout<<jl[i].a<<":"<<jl[i].b<<"\n";
}

G 手机号加密(字符串模拟)

这个题细节还是比较多的

注意以下细节

①转换到二进制的时候高位补0

②转换回来的时候低位补0外加截取8位

其他的就是一个进制转换的问题,比较老生常谈了

代码

#include <bits/stdc++.h>
using namespace std;
int qp(int a,int b)
{
  int re=1;
  for(int i=0;i<b;i++)
  re*=a;
  return re;
}
stack<char> st;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int a,sum=0,id;
  cin>>a;
  while(a)
  {
    st.push(a%2);
    a/=2;
  }
  string t="",tt="";
  while(st.size())
  {
    t+=char(st.top()+'0');
    st.pop();
  }
  for(int i=t.size();i<27;i++)
  t='0'+t;
  reverse(t.begin(),t.end());
  //cout<<t<<"\n";
  for(int i=0;i<t.size();i++)
  if(t[i]!='0')
  {
    id=i;
    break;
  }
  for(int i=id;i<t.size();i++)
  tt+=t[i];
  reverse(tt.begin(),tt.end());
  for(int i=0;i<tt.size();i++)
  sum+=(tt[i]-'0')*qp(2,i);
  stringstream sss;
  sss<<sum;
  string ss;
  sss>>ss;
  for(int i=ss.size();i<8;i++)
  ss='0'+ss;
  int st=ss.size()%8;
  for(int i=st;i<ss.size();i++)
  cout<<ss[i];
}

H 学生代表(数学)

就是找中位数,既然都是奇数了,那么中位数可以排个序然后取num[n/2]即可,我不知道为啥我这个还re两次。。。。

代码

#include <bits/stdc++.h>
using namespace std;
int t[555555],ans[555555],num[555][555];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin>>n;
  for(int i=0;i<n;i++)
  for(int j=0;j<n;j++)
  cin>>num[i][j];
  for(int i=0;i<n;i++)
  {
    for(int j=0;j<n;j++)
    t[j]=num[i][j];
    sort(t,t+n);
    ans[i]=t[n/2];
  }
  sort(ans,ans+n);
  cout<<ans[n/2];
}

I 拯救花园(贪心)

比较水的贪心题

贪心策略为:

破坏力/时间,小的放在前面

答案的算法

①我们如果一个一个去拿去模拟也是可以,不过我觉得那样比较麻烦,我们不如递推一个时间数组

②这个数组是干什么用的呢?

(1)首先我们发现贪心越靠前的,算的时间越多。而且他们每次的破坏力又一样,实际上可以只扫描一遍把破坏力乘以这个兔子总共破坏的时间即可

(2)这个时间数组就是他们时间的前缀和,然后兔子破坏力的总时间就是用最后最长的时间减去当前兔子所具有的前缀时间

之后把答案输出一下就可以了

代码

#include <bits/stdc++.h>
using namespace std;
struct node
{
  double l,r;
}num[1100];
bool cmp(node a,node b)
{
  return a.r/a.l<b.r/b.l;
}
int tim[1000];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,sum=0;
  cin>>n;
  for(int i=0;i<n;i++)
  cin>>num[i].l>>num[i].r;
  sort(num,num+n,cmp);
  for(int i=0;i<n;i++)
  {
    if(i==0)
    tim[i]=num[i].l*2;
    else
    tim[i]=num[i].l*2+tim[i-1];
  }
  for(int i=0;i<n-1;i++)
  {
    sum+=num[i].r*(tim[n-1]-tim[i]);
  }
  cout<<sum;
}

J 摘李子(语法基础)

代码

#include <bits/stdc++.h>
using namespace std;
int num[2000];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,sum=0,ans=0;
  cin>>n;
  for(int i=0;i<n;i++)
  cin>>num[i],sum+=num[i];
  int r1=sum/n;
  ans+=sum%n;
  if(sum%n<r1)
  {
    ans+=n;
    r1--;
  }
  cout<<r1<<"\n"<<ans;
}

K 阅读训练(前缀和)

把他们的前缀和算出来去跟询问的数比较即可。注意第一个数要-1

代码

#include <bits/stdc++.h>
using namespace std;
int sum[10000],cs[10000],ys[10000];
stack<char> st;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,q;
  cin>>n>>q;
  for(int i=1;i<=n;i++)
  cin>>ys[i];
  for(int i=1;i<=q;i++)
  cin>>cs[i];
  for(int i=1;i<=n;i++)
  {
    if(i==1)
    sum[i]=ys[i]-1+sum[i-1];
    else
    sum[i]=ys[i]+sum[i-1];
  }
  for(int i=1;i<=q;i++)
  {
    for(int j=1;;j++)
    {
      if(sum[j]>cs[i])
      {
        cout<<j<<"\n";
        break;
      }
      else if(sum[j]==cs[i])
      {
        cout<<j<<"\n";
        break;
      }
    }
  }
}

L 填字游戏(字符串模拟)

我也不知道为啥好多人做不出来,这个题我可能运气好昏迷一次就过了

说一下我的思路

①输入地图

②扫描一遍把数放进去

(1)这里可以把遇到#就存之前的数,然后内部循环结束后也存一下数,这些数都是用字符串存的,因为他们比较大可能有最多25位

③排序,定义规则先排字符串的长度,长度小优先,长度一样排字典序

④输出,输出的时候我还有空格,所以我又加了一些特判条件,最后输出就过了

代码

#include <bits/stdc++.h>
using namespace std;
bool cmp(string a,string b)
{
  return a.size()==b.size()?a<b:a.size()<b.size();
}
char mp[100][100];
string st[1000000];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,m,p=0;
  cin>>n>>m;
  for(int i=0;i<n;i++)
  for(int j=0;j<m;j++)
  cin>>mp[i][j];
  for(int i=0;i<n;i++)
  {
    string t="";
    for(int j=0;j<m;j++)
    {
      if(mp[i][j]!='#')
      t+=mp[i][j];
      else if(mp[i][j]=='#'&&t!="")
      {
        st[p++]=t;
        t="";
      }
    }
    st[p++]=t;
  }
  for(int i=0;i<p;i++)
  {
    string jk="";
    for(int j=0;j<st[i].size();j++)
    if(isdigit(st[i][j]))
    jk+=st[i][j];
    st[i]=jk;
  }
  sort(st,st+p,cmp);
  for(int i=0;i<p;i++)
  if(st[i]!="")
  {
    cout<<st[i];
    break;
  }
}

M 铺地砖(递推)

公式是

f[i]=f[i-1]+2*f[i-2]

主要最后还有数太大了得用大数,别的就没啥了

代码

#include <bits/stdc++.h>
using namespace std;
string jx(string a)
{
  reverse(a.begin(),a.end());
  string b=a;
  int jw=0,n,now;
  string t="";
  for(int i=0;i<a.size();i++)
  {
    n=a[i]+b[i]-'0'-'0'+jw;
    jw=n/10;
    now=n%10;
    t+=char(now+'0');
  }
  if(jw)
  t+="1";
  reverse(t.begin(),t.end());
  return t;
}
string cal(int n)
{
  string t1="1";
  string t2="3";
  for(int i=3;i<=n;i++)
  {
    t1=jx(t1);
    if(t1.size()<t2.size())
    {
      for(int i=t1.size();i<t2.size();i++)
      t1='0'+t1;
    }
    else if(t2.size()<t1.size())
    {
      for(int i=t2.size();i<t1.size();i++)
      t2='0'+t2;
    }
    reverse(t1.begin(),t1.end());
    reverse(t2.begin(),t2.end());
    int jw=0,n,now;
    string t="";
    for(int i=0;i<t1.size();i++)
    {
      n=t1[i]+t2[i]-'0'-'0'+jw;
      jw=n/10;
      now=n%10;
      t+=char(now+'0');
    }
    if(jw)
    t+="1";
    reverse(t.begin(),t.end());
    reverse(t2.begin(),t2.end());
    t1=t2;
    t2=t;
  }
  return t2;
}
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin>>n;
  if(n==1)
  cout<<1;
  else if(n==2)
  cout<<3;
  else
  cout<<cal(n);
}

python版(比赛禁用python)

a=[1000]
a.append(1)
a.append(3)
for i in range(3,101):
    a.append(a[i-1]+2*a[i-2])
t=int(input())
print(a[t])
posted @ 2018-12-15 22:52  baccano!  阅读(334)  评论(0编辑  收藏  举报