迎接2019多校联合新生训练赛(2018/12/31)

A 新年礼物(数学)

这个题之前cf div2刚刚考过应该都会吧。就是把左边界×2遍历一下就可以了

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ll l,r,sum=0;
  cin>>l>>r;
  for(ll i=l;i<=r;)
  i*=2,sum++;
  cout<<sum;
}

B 水(看不懂题)

待填坑

C 滴(物理)

追击相遇问题其中一个走了一段的距离了,两个都是匀速直线运动这个物理题应该都会的

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  double x,y,t;
  cin>>x>>y>>t;
  double tm=x*t/(y-x);
  double ans=t*x+tm*x;
  cout<<int(ans);
}

D 石(思维)

这个题比较厉害,首先感谢qut同学的帮助

我们发现如果直接去遍历所有的子集的话那么对于100来说这个量是巨大的,并且要求有多少不相同的子集和,那么我们第一想到的事开桶

开完桶之后我们想的就是去遍历,遍历怎么遍历?怎么模拟子集的遍历而且还不T

这里qut的同学提供了一种O(n*n)的解法

外层的for用来遍历每个数对于每个数我们需要对前面所有的不重复的数进行一次加法

①首先遍历一次,把之前的所有的数都加起来然后再bk判定

②把这个数自己bk判定

输出总共计数的t即可,也可以用set。这里得用map了因为不知道要记录多大

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
unordered_map<ll,ll> bk,num;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ll n,t=0;
  cin>>n;
  for(int i=0;i<n;i++)
  {
    ll p,q;
    cin>>p;
    q=t;
    for(int j=0;j<q;j++)
    {
      if(!bk[p+num[j]])
      {
        bk[p+num[j]]=1;
        num[t++]=p+num[j];
      }
    }
    if(!bk[p])
    {
      bk[p]=1;
      num[t++]=p;
    }
  }
  cout<<t;
}

E 穿(字符串基础)

直接暴力枚举即可

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[100005],sum[100005],ans[100005];
ll bk[1000][1000],bk1[1000][1000];
ll n,k,re=0;
set<string> st;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  string t="";
  cin>>n>>k>>num[0];
  sum[0]=num[0]%4;
  for(int i=1;i<n;i++)
  num[i]=(num[i-1]*6807+2831)%201701,sum[i]=num[i]%4;
  for(int i=0;i<n;i++)
  {
    if(sum[i]==0)
    t+=‘A‘;
    else if(sum[i]==1)
    t+=‘T‘;
    else if(sum[i]==2)
    t+=‘C‘;
    else if(sum[i]==3)
    t+=‘G‘;
  }
  for(int i=0;i<n-k+1;i++)
  {
    string te="";
    for(int j=0;j<k;j++)
    te+=t[i+j];
    st.insert(te);
  }
  cout<<st.size();
}

F 有(不明)

待填坑

G 志(贪心)

拿出来排个序求一下前缀和然后加把起来就行了

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[100005],sum[100005],ans[100005];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ll n,re=0;
  cin>>n>>num[0];
  sum[0]=num[0]%100+1;
  for(int i=1;i<n;i++)
  num[i]=(num[i-1]*6807+2831)%201701,sum[i]=(num[i]%100)+1;
  sort(sum,sum+n);
  for(int i=0;i<n;i++)
  {
    if(i)
    ans[i]=ans[i-1]+sum[i];
    else
    ans[i]=sum[i];
  }
  for(int i=0;i<n;i++)
  re+=ans[i];
  cout<<re;
}

H 竟(语法基础)

注意之间两个空格,还一次pe可以

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ll n;
  cin>>n;
  for(int i=1;i<=n;i++)
  if(i%2!=0&&i%5!=0)
  cout<<i<<"  ";
}

I 成(枚举)

先把墙壁涂上色,然后把没有涂色的方格进行一次判断,如果左右两边都有墙壁的话,那么可以把这一部分涂色另一种颜色,最后找出颜色数量即可

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num[100005],sum[100005],ans[100005];
ll bk[1000][1000],bk1[1000][1000];
ll n,re=0;
void dfs(int x,int y)
{
  int f=0,ff=0;
  for(int i=y;i>=0;i--)
  if(bk[x][i])
  {
    f=1;
    break;
  }
  for(int i=y;i<n;i++)
  if(bk[x][i])
  {
    ff=1;
    break;
  }
  if(f&&ff)
  {
    for(int i=y;i>=0;i--)
    if(!bk[x][i])
    bk1[x][i]=1;
    else
    break;
    for(int i=y;i<n;i++)
    if(!bk[x][i])
    bk1[x][i]=1;
    else
    break;
  }
}
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin>>n>>num[0];
  sum[0]=num[0]%10;
  for(int i=1;i<n;i++)
  num[i]=(num[i-1]*6807+2831)%201701,sum[i]=num[i]%10;
  for(int i=0;i<n;i++)
  for(int j=0;j<sum[i];j++)
  bk[j][i]=1;
  for(int i=0;i<n;i++)
  for(int j=0;j<n;j++)
  if(!bk[i][j])
  dfs(i,j);
  for(int i=0;i<n;i++)
  for(int j=0;j<n;j++)
  if(bk1[i][j])
  re++;
  cout<<re;
}

J 新年加油(无语)

上来直接输出就行,然后都错了。大家都错了,后来听qut的说要用Unicode的才行,然后才ac之后又重判了。。。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout<<"I\n\nW\ni\nl\nl\n\nt\nr\ny\n\nm\ny\n\nb\ne\ns\nt\n\nf\no\nr\n\n2\n0\n1\n9\n!";
}

原文地址:https://www.cnblogs.com/baccano-acmer/p/10203908.html

时间: 2024-07-30 22:06:07

迎接2019多校联合新生训练赛(2018/12/31)的相关文章

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; r

Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)

D 10248 修建高楼 D 传送门 题干 题目描述 C 市有一条东西走向的"市河".C 市的市长打算在"市河"的其中一条岸边自东往西的 n 个位置(可以将这 n 个位置看成在一条直线上,且位置不会重叠)依次建造高楼. C 市的设计部门设计了 T 个方案供市长挑选(方案编号为 1 到 T).每个方案都提供了建造的每幢高楼的高度,自东向西依次为 h1,h2,h3,-,hn-1,hn.每幢楼房的高度在 1 到 n 之间(包括 1 和 n),且各不相同. 市长在挑选设计方

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

感慨 这次有点感冒,昏迷程度比较大中途还溜了 感谢 感谢qut的同学的帮助!!! A 小X与三角形(数学) 公式 两边的和-两边的差-1 因为边最小得大于两边的差,边最大得小于两边的和所以说求得是一个开区间内元素的个数 代码 #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll a,

郑州大学2018新生训练赛第十场题解

比赛(补题)地址:http://222.22.65.164/problemset.php 题号为:4305 -- 4309 总述:这次新生赛难度偏于平和,但涵盖方面甚广,其中一道签到题是c语言题,并且有两道是hdu一百题的原题,一道简单的最小生成树,唯一"有些难度"的应该是一道数论题(毕竟本来自己就是搞数学的).   A.沙漠骆驼 这是一道经典的递推问题,原型为HDU 2044的"一只小蜜蜂-".思路很简单,以第5个沙丘为例,到达第五个沙丘的方式有两种:从第3个向

2017光棍节新生训练赛

Description There are some students in a class, Can you help teacher find the highest student . Input There are some cases. The first line contains an integer t, indicate the cases; Each case have an integer n ( 1 ≤ n ≤ 100 ) , followed n students' h

2018.12.2 中国石油大学第一次新生训练赛题解

整理人: 周翔 A题:李继朋 B题:李继朋 H题:魏斯博 原文地址:https://www.cnblogs.com/QLU-ACM/p/10057831.html

新生训练赛002题解

------------恢复内容开始------------ J 新年快乐!!! I 十进制中的二进制: 题目hkhv学长最近对二进制数很感兴趣,喜欢一切0和1组成的数.现在有一个十进制整数n,问你1到n之间有多少个数是只有0和1组成的类似二进制的数,输出他们的个数.Input输入数据包含一个数n (1 <= n <=10^9).Output输出1到n中类似二进制的数的个数.Sample Input10Sample Output2Hint对于n = 10,1 和 10是类似二进制的数. 思路:

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也