2016 Personal Training #4 Div.2 A B C G H

时间:2021-01-16 04:27:04

A URAL 2091

题意:有四个类别1.A和B都包含,2.只包含A不包含B,3.只包含B不包含A,4.A和B都不包含,A,B是课程,然后n行m列数字只包含1和0,1表示包含0表示不包含,求这n行这四类那种情况最多,并输出哪两种课程应该被选择,选择条件是A,B满足在n行中这四种都出现。

思路:直接遍历查找所有情况然后记录最大值输出即可。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
int p[105][105];
int main()
{
  int n,m;
  scanf("%d%d",&n,&m);
  for(int i=0;i<n;i++)
  {
    for(int j=0;j<m;j++)
    {
      scanf("%d",&p[i][j]);
    }
  }
  int a=0,b=0,c=0,d=0,x=0,y=0;
  int sum=INF,ans;
  for(int i=0;i<n;i++)
  {
    for(int j=0;j<m;j++)
    {
      if(i==j) continue;
      a=0;b=0;c=0;d=0;
      for(int k=0;k<n;k++)
      {
        if(p[k][i]&&p[k][j])
          a++;
        if(p[k][i]&&p[k][j]==0)
          b++;
        if(p[k][i]==0&&p[k][j])
          c++;
        if(p[k][i]==0&&p[k][j]==0)
          d++;
      }
      ans=0;
      ans=max(ans,a);
      ans=max(ans,b);
      ans=max(ans,c);
      ans=max(ans,d);
      if(ans<sum)
      {
        sum=ans;
        x=i;y=j;
      }
    }
  }
  printf("%d\n",sum);
  printf("%d %d\n",x+1,y+1);
}
B URAL 2095

水题直接上代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
int main()
{
  int n,m;
  scanf("%d%d",&n,&m);
  int a=2,b=2,ans=n-1;
  while(ans>=a)
  {
    ans-=(ans/a);
    a++;
  }
  while(m>=b)
  {
    m-=(m/b);
    b++;
  }
  printf("%d\n",m-ans);
}
Gym 100971J

题意:这题说实在的题意是有问题的,描述可能有一定的漏洞,想的多的人可能会多考虑情况,输入的是一个字符矩阵由‘.‘,’#‘和两数字构成问能否将两数字位置交换,且当两数字相邻时不能交换。

思路:因为没说明同时出发也没说明一个走的时候另一个必须走,所以就出现只要出现T字路口就可以交换,还有一种情况是两个相邻但连接两个的'.'却有2个以上。根据这个就能AC了。在处理上有个问题就是由于n×m是200000所以用二维数组就会爆,所以可以用vector或者map。

代码如下:

#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
vector<string>str(200005);
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int main()
{
  int n,m;
  scanf("%d%d",&n,&m);
  for(int i=0;i<n;i++)
  {
    cin>>str[i];
  }
  int flag=1;
  for(int i=0;i<n;i++)
  {
    for(int j=0;j<m;j++)
    {
      int ans=0;
      if(str[i][j]!='#')
      {
        for(int k=0;k<4;k++)
        {
          int xx=dx[k]+i;
          int yy=dy[k]+j;
          if(xx<0||yy<0||xx>=n||yy>=m)
            continue;
          if(str[xx][yy]!='#')
            ans++;
        }
      }
      if(ans>=3)
      {
        printf("YES\n");return 0;
      }
      if(ans==1) flag=0;
    }
  }
  if(flag==0) printf("NO\n");
  else printf("YES\n");
}
G Gym 100971F

数学水题不解释。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
int main()
{
  int x1,x2,y1,y2,v1,u1,v2,u2;
  scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  scanf("%d%d%d%d",&v1,&u1,&v2,&u2);
  double a=((v1-v2)*(v1-v2)+(u1-u2)*(u1-u2));
  double b=2*((x1-x2)*(v1-v2)+(y1-y2)*(u1-u2));
  double c=((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  double ans=(4*a*c-b*b)/(4*a);
  if(a*b<0)
  printf("%.6f\n",sqrt(ans));
  else printf("%.6f\n",sqrt(c));
}
H CodeForces 631C

这题我的博客之前写过可以去Codeforces文章分类里找,这里不再叙述。