2016 ICPC 大连站

本报告详细解析了HDU在线评测系统中六道题目的解题思路,包括简单的博弈论、三角形面积计算、取模运算、二分图染色等,涉及Java高精度计算和逆元技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

Rank:99 / 218    45.41%

这次还是六个题,罚时有点多,那个java高精度的题,如果对java特别熟悉的话,应该是很水的一个题,可惜没做出来。

HDU 5978

签到题。博弈,如果n是奇数,先手赢得概率大,如果n是偶数,先手后手赢得概率一样大。

HDU 5979

签到题。用三角形面积公式1.0/2*a*b*sin(c)就行了,不过需要注意的是,用三角函数需要转化成弧度制。

HDU 5980

签到题。取模,除97再取模,直到这个数为0,统计97出现的次数即可。

HDU 5974

韩巍和程磊做的。

HDU 5976

韩巍推的公式。不过我WA了一发,因为这个题要求取模,做除法的时候不能直接出,需要转换成逆元做乘法!

HDU 5971

这个题主要是题意没整明白,实际上就是一个二分图染色。

具体的可以看这个博客的讲解: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;
}

HDU 5973

裸的威佐夫博弈+java高精度。

详见:https://blog.youkuaiyun.com/flyzer/article/details/102518450

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值