2020hdu多校4

hdu6803
题目
时间是越小越好
简单水题

#include <iostream>

using namespace std;
int a[1005];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int T;
    cin>>T;
    while(T--)
    {
        int min_=1e9+5;
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            int A,D;
            cin>>A>>D;
            a[i]=((100/A)+(100%A!=0)-1)*D;
            if(a[i]<min_)
                min_=a[i];
        }
        int res=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]==min_)
            {
                res++;
            }
        }
        double xx=1.0*res/(2*n);
        cout<<1-xx<<"\n";
    }
    return 0;
}

hdu6805
题目
拆点最短路径
(经典题)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll INF=1e18;
const int maxn=1e5+5;
const int maxm=2e5+5;
ll n,m,s,t,xx;
ll S,T;
char str[maxn];
ll dis[maxn*2];
bool vis[maxn*2];
struct node
{
    ll v,w;
    node()
    {
    }
    node(ll v_,ll w_)
    {
        v=v_;
        w=w_;
    }
    bool operator <(const node & b)const
    {
        return w>b.w;
    }
};
priority_queue<node> que;
struct edge
{
    ll v,next,w;
};
edge no[10*maxm];
int head[2*maxn];
int cnt;
void init()
{
    cnt=1;
    memset(head,0,sizeof(head));
}
void add(ll x,ll y,ll w)
{
    no[cnt].v=y;
    no[cnt].w=w;
    no[cnt].next=head[x];
    head[x]=cnt;
    cnt++;
}
void dijkstra()
{
    for(int i=0;i<2*maxn;i++)
    {
        dis[i]=INF;
        vis[i]=false;
    }
    while(!que.empty())
        que.pop();
    que.push(node(S,0));
    dis[S]=0;
    while(!que.empty())
    {
        node ne=que.top();
        que.pop();
        ll u=ne.v;
        if(vis[u])
            continue;
        vis[u]=true;
        for(int i=head[u];i;i=no[i].next)
        {
            ll v=no[i].v;
            ll w=no[i].w;
            if(dis[v]>dis[u]+w&&!vis[v])
            {
                dis[v]=dis[u]+w;
                que.push(node(v,dis[v]));
            }
        }
    }
    cout<<dis[T]<<"\n";
}
void solve()
{
    cin>>n>>m>>s>>t>>xx;
    cin>>str+1;
    S=1,T=0;
    for(int i=1;i<=m;i++)
    {
        ll x,y,z;
        cin>>x>>y>>z;
        for(int tx=0;tx<2;tx++)
        {
            if(tx==0&&str[x]=='R')
                continue;
            if(tx==1&&str[x]=='L')
                continue;
            for(int ty=0;ty<2;ty++)
            {
                if(ty==0&&str[y]=='R')
                    continue;
                if(ty==1&&str[y]=='L')
                    continue;
                add(x<<1|tx,y<<1|ty,z+(tx!=ty)*xx);
                add(y<<1|ty,x<<1|tx,z+(tx!=ty)*xx);
            }
        }
    }
    for(int ts=0;ts<2;ts++)
    {
        if(ts==0&&str[s]=='R')
            continue;
        if(ts==1&&str[s]=='L')
            continue;
        add(S,s<<1|ts,0);
    }
    for(int tt=0;tt<2;tt++)
    {
        if(tt==0&&str[t]=='R')
            continue;
        if(tt==1&&str[t]=='L')
            continue;
        add(t<<1|tt,T,0);
    }
    dijkstra();
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int _=1;
    cin>>_;
    while(_--)
    {
        init();
        solve();
    }
    return 0;
}

hdu6806
题目
简单dp dp[i]=dp[i-1](i和i-1不换)+dp[i-2](i 和i-1 换)

#include <bits/stdc++.h>
using namespace std;
typedef long long  ll;
const int INF=1e9+5;
const int mod=1e9+7;
const int maxn=1e5+5;
int dp[maxn];
void init()
{

}
void solve()
{
    int n;
    dp[0]=1;
    dp[1]=1;
    cin>>n;
    string s,pre;
    for(int i=1;i<=n;i++)
    {
        if(i==1)
        {
            cin>>pre;
            continue;
        }
        cin>>s;
        if(s==pre)
        {
            dp[i]=dp[i-1];
        }
        else
        {
            dp[i]=(1ll*dp[i-1]+1ll*dp[i-2])%mod;
        }
        pre=s;
    }
    cout<<dp[n]<<endl;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int _=1;
    cin>>_;
    while(_--)
    {
        init();
        solve();
    }
    return 0;
}

hdu6808
题目

#include <bits/stdc++.h>
using namespace std;
typedef long long  ll;
const ll INF=1e18;
const int maxn=1e5+5;
vector<ll> vv,uu;
ll l[maxn*2],r[maxn*2];
int level[maxn*2];
queue <int >q;
int n;
struct edge
{
    int v,next;
    ll w;
};
edge no[maxn*20];
int head[maxn*2];
int cnt;
void add(int u,int v,int w)
{
    no[cnt].v=v;
    no[cnt].w=w;
    no[cnt].next=head[u];
    head[u]=cnt;
    cnt++;
    no[cnt].v=u;
    no[cnt].w=0;
    no[cnt].next=head[v];
    head[v]=cnt;
    cnt++;
}
void init()
{
    vv.clear(),uu.clear();
    cnt=1;
    memset(head,0,sizeof(head));
}
bool bfs(int s,int t,int n)
{
    for(int i=1;i<=n;i++)
        level[i]=-1;
    while(!q.empty())
        q.pop();
    q.push(s);
    level[s]=0;
    while(!q.empty())
    {
        int u=q.front();
        if(u==t)
            return true;
        q.pop();
        for(int i=head[u];i;i=no[i].next)
        {
            edge &e=no[i];
            if(e.w>0&&level[e.v]==-1)
            {
                level[e.v]=level[u]+1;
                q.push(e.v);
            }
        }
    }
    return false;
}
ll dfs(int u,int t,ll max_)
{
    if(u==t)
        return max_;
    ll sum=0;
    for(int i=head[u];i;i=no[i].next)
    {
        edge &e=no[i];
        if(e.w>0&&level[e.v]==level[u]+1)
        {
            ll f=dfs(e.v,t,min(e.w,max_-sum));
            sum+=f;
            e.w-=f;
            no[1+((i-1)^1)].w+=f;
            if(sum==max_)
                break;
        }
    }
    if(!sum)
        level[u]=-1;
    return sum;
}
ll dinic(int s,int t,int n)
{
    ll ans=0;
    while(bfs(s,t,n))
    {
        ll f;
        while((f=dfs(s,t,INF))>0)
        {
            ans+=f;
        }
    }
    return ans;
}
void discreate()
{
    sort(uu.begin(),uu.end());
    sort(vv.begin(),vv.end());
    uu.erase(unique(uu.begin(),uu.end()),uu.end());
    vv.erase(unique(vv.begin(),vv.end()),vv.end());
    for(int i=1;i<=n;i++)
    {
        l[i]=lower_bound(uu.begin(),uu.end(),l[i])-uu.begin()+1;
        r[i]=lower_bound(vv.begin(),vv.end(),r[i])-vv.begin()+1+uu.size();
    }
}
void build()
{
    int s,t;
    s=2*n+1,t=2*n+2;
    /*for(int i=1;i<=uu.size();i++)
        add(s,i,1);*/
    for(int i=1;i<=n;i++)
        add(l[i],r[i],1);
    /*for(int i=1;i<=vv.size();i++)
        add(i+uu.size(),t,1);*/
    for(int i=0;i<uu.size();i++)
        add(s,i+1,1);
    for(int i=0;i<vv.size();i++)
        add(i+1+uu.size(),t,1);
    cout<<dinic(s,t,2*n+2)<<endl;
}
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        ll t,x;
        cin>>t>>x;
        l[i]=t-x,r[i]=t+x;
        uu.push_back(t-x);
        vv.push_back(t+x);
    }
    discreate();
    build();
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int _=1;
    cin>>_;
    while(_--)
    {
        init();
        solve();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值