中石油2019寒假集训第一场(新生场)(补题)

中石油校内的比赛,只能后续补题了,题目来说还是比较的不错

A 数方格(思维)

规定了都是正方形,那么枚举就可以一行的按照规律也好枚举列数也好枚举

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n,m,ans=0;
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
    int sum=0;
    for(int j=1;j<=m-i+1;j++)
    sum++;
    ans+=sum*(n-i+1);
  }
  cout<<ans;
}

B 找朋友(map)

map来一波就行

代码

#include <bits/stdc++.h>
using namespace std;
map<string,int> bk;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin>>n;
  while(n--)
  {
    string a;
    cin>>a;
    bk[a]++;
  }
  int m;
  cin>>m;
  while(m--)
  {
    string a;
    cin>>a;
    if(bk[a])
    cout<<a<<"\n";
  }
}

C 高校录取(排序)

结构体排序走一波就行

代码

#include <bits/stdc++.h>
using namespace std;
struct node
{
  int sum,yw,ss,yy,zh,id;
}num[100005];
bool cmp(node a,node b)
{
  return a.sum==b.sum?a.ss==b.ss?a.zh==b.zh?a.yw==b.yw?a.id<b.id:a.yw>b.yw:a.zh>b.zh:a.ss>b.ss:a.sum>b.sum;
}
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,a,b;
  cin>>n>>a>>b;
  for(int i=0;i<n;i++)
  cin>>num[i].yw>>num[i].ss>>num[i].yy>>num[i].zh,num[i].id=i,num[i].sum=num[i].yw+num[i].ss+num[i].yy+num[i].zh;
  sort(num,num+n,cmp);
  for(int i=a-1;i<=b-1;i++)
  cout<<num[i].id+1<<" "<<num[i].sum<<"\n";
}

D 围栏翻新(思维)

感谢qut同学的帮助

而且我刚开始读错题了,以为一次能刷任意的高度,没想到一次能刷的只有高度1。。

这个题如果有参差不齐的情况那么可以把他们分成多个部分

所以分成多个部分看看每一部分最高能到多少,而且相邻部分也是加上一个高度差,这样就算是换了部分也能正确的算出

代码

#include <bits/stdc++.h>
using namespace std;
int num[100005];
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];
    if(!i)
    sum+=num[i];
    else if(num[i]>num[i-1])
    sum+=num[i]-num[i-1];
  }
  cout<<sum;
}

E Maximum Increase(语法基础)

以为是LIS+二分实际上有连续的条件,就是找最长的连续的LIS那么用语法套就行了

代码

#include <bits/stdc++.h>
using namespace std;
int num[100005];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,re=1,ans=-1;
  cin>>n;
  for(int i=1;i<=n;i++)
  cin>>num[i];
  num[n+1]=-1;
  for(int i=2;i<=n+1;i++)
  if(num[i]>num[i-1])
  re++;
  else
  ans=max(ans,re),re=1;
  cout<<ans;
}

F Lovely Palindromes(字符串基础)

输入字符串倒序一个副本原来的加上副本就行

代码

#include <bits/stdc++.h>
using namespace std;
int num[100005];
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  string a;
  cin>>a;
  string b=a;
  reverse(b.begin(),b.end());
  a+=b;
  cout<<a;
}

G The Same Calendar(数学)

因为说明了日历只有周几那么就是找经过多少年后能回到这个第一天的周几

这里还得判断闰年与平年,如果闰年那么也得回到一个闰年,如果平年那么得回到一个平年

我们实际上并不需要知道这一年的第一天到底是周几,我们只需要知道经过多少年能回到这一天即可

那么我们应该怎么算下一年的第一天距离这一年的第一天有多少距离呢?

实际上用余数就行用365%7看一看经过多少周的余数就行,只要这些余数加把起来能够%7就说明回到了这一天

还得注意闰年要找闰年,平年找平年

最初我还以为一年有356天。。。。。

代码

#include <bits/stdc++.h>
using namespace std;
int check(int n)
{
  if(n%400==0||(n%4==0&&n%100!=0))
  return 1;
  else
  return 0;
}
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n,t;
  cin>>n;
  if(check(n))
  {
    t=2;
    for(int i=n+1;;i++)
    {
      if(t%7==0&&check(i))
      return cout<<i,0;
      if(check(i))
      t+=2;
      else
      t+=1;
    }
  }
  else
  {
    t=1;
    for(int i=n+1;;i++)
    {
      if(t%7==0&&!check(i))
      return cout<<i,0;
      if(check(i))
      t+=2;
      else
      t+=1;
    }
  }
}
posted @ 2019-01-14 14:20  baccano!  阅读(112)  评论(0编辑  收藏