题意:有四个类别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);
}
CGym 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文章分类里找,这里不再叙述。