Rank:99 / 218 45.41%
这次还是六个题,罚时有点多,那个java高精度的题,如果对java特别熟悉的话,应该是很水的一个题,可惜没做出来。
签到题。博弈,如果n是奇数,先手赢得概率大,如果n是偶数,先手后手赢得概率一样大。
签到题。用三角形面积公式1.0/2*a*b*sin(c)就行了,不过需要注意的是,用三角函数需要转化成弧度制。
签到题。取模,除97再取模,直到这个数为0,统计97出现的次数即可。
韩巍和程磊做的。
韩巍推的公式。不过我WA了一发,因为这个题要求取模,做除法的时候不能直接出,需要转换成逆元做乘法!
这个题主要是题意没整明白,实际上就是一个二分图染色。
具体的可以看这个博客的讲解:https://blog.youkuaiyun.com/qq_33402621/article/details/53056371
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
#define de cout<<endl<<endl<<endl
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=20010;
using namespace std;
int tot,ver[N],head[2010],Next[N],v[2010],a[N],b[N];
int n,m,f;
bool vis[2010];
map<int,int> mp;
void add(int x,int y)
{
ver[++tot]=y;Next[tot]=head[x];head[x]=tot;
}
void init()
{
tot=0;
f=0;
for(int i=1;i<=n;i++)
v[i]=0;
mem(head,0);
mem(v,0);
mp.clear();
}
void dfs(int x)
{
for(int i=head[x];i;i=Next[i])
{
int y=ver[i];
if(v[y]==v[x])
{f++;return ;}
if(v[y]!=0)
continue;
v[y]=3-v[x];
dfs(y);
}
}
void dfss(int x)
{
for(int i=head[x];i;i=Next[i])
{
int y=ver[i];
vis[x]=true;
vis[y]=true;
if(v[y]==v[x])
{f++;return ;}
if(v[y]!=0)
continue;
v[y]=7-v[x];
dfss(y);
}
}
int main()
{
tot=0;f=0;
int x,y,xx,yy;
mem(head,0);mem(vis,false);
while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)
{
for(int i=1;i<=m;i++)
{scanf("%d%d",&xx,&yy);add(xx,yy);add(yy,xx);}
for(int i=1;i<=x;i++)
{scanf("%d",&a[i]);v[a[i]]=1;mp[a[i]]=1;}
for(int i=1;i<=y;i++)
{scanf("%d",&b[i]);if(v[b[i]]==1) f++; v[b[i]]=2;mp[b[i]]=1;}
for(int i=1;i<=x;i++)
dfs(a[i]);
for(int i=1;i<=y;i++)
dfs(b[i]);
for(int i=1;i<=n;i++)
if(mp[i]==0&&v[i]==0)
{v[i]=3;dfss(i);}
for(int i=1;i<=n;i++)
if(v[i]!=1&&v[i]!=2&&vis[i]==false)
{f++;break;}
if(f) printf("NO\n");
else printf("YES\n");
init();
}
return 0;
}
裸的威佐夫博弈+java高精度。
详见:https://blog.youkuaiyun.com/flyzer/article/details/102518450