2020hdu多校7

hdu6852
题目
就是对于有最多k个逆序的反过来往后排
前面是正序的找到一个(正序的长度+((n-正序的长度)%逆序的长度!=0)+(n-正序的长度)/逆序的长度))

#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int T;
    cin>>T;
    int flag;
    while(T--)
    {
        flag=0;
        int n,x,y;
        cin>>n>>x>>y;
        int t=0;
        for(;t<=n;t++)
        {
            if(t+((n-t)%y!=0)+(n-t)/y==x)
            {
                break;
            }
        }
        if(t>n||(n-t)/y==0)
        {
            cout<<"NO"<<"\n";
            continue;
        }
        cout<<"YES"<<"\n";
        for(int i=1;i<=t;i++)
        {
            cout<<i<<" ";
            flag++;
        }
        if((n-t)%y!=0)
        {
            for(int i=t+(n-t)%y;i>t;i--)
            {
                cout<<i<<" ";
                flag++;
            }
        }
        int ss=(n-t)/y;
        while(ss--)
        {
            for(int i=n-ss*y;i>=n+1-(ss+1)*y;i--)
            {
                cout<<i;
                flag++;
                if(flag!=n)
                    cout<<" ";
            }
        }
        cout<<"\n";
    }
    return 0;
}

hdu6853
题目

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int dir[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
ll x,y;
int flag;
ll ans,bns;
map<pair<ll,ll>,int>M;
queue <pair<ll,ll> > Q;

void bfs()
{
    pair<ll,ll> head,next;
    head.first=x;
    head.second=y;
    Q.push(head);
    M[head]=1;
    while(!Q.empty())
    {
        head=Q.front();
        if(head.first==head.second)
        {
            cout<<"0/1"<<endl;
            return;
        }
        ans++;
        Q.pop();
        for(int i=0;i<8;i++)
        {
            next.first=head.first+dir[i][0];
            next.second=head.second+dir[i][1];
            if(__gcd(next.first,next.second)>1)
            {
                ans++;
                if(M[next]==0)
                {
                    Q.push(next);
                    M[next]=1;
                }
            }
        }
        if(flag==0)
        {
            bns=ans;
            flag=1;
        }
    }
    ll g=__gcd(ans,bns);
    cout<<bns/g<<"/"<<ans/g<<"\n";
}
int main()
{
    ios::sync_with_stdio(0);
    int T;
    cin>>T;
    while(T--)
    {
        M.clear();
        flag=0;
        bns=0;
        ans=0;
        cin>>x>>y;
        while(!Q.empty())
        {
            Q.pop();
        }
        bfs();
    }
    return 0;
}

hdu6850
题目

#include <bits/stdc++.h>
using namespace std;
const int maxn=2005;
typedef long long ll;
struct node
{
    ll x,y;
};
node no[maxn];
int visit[maxn];
set<int>vv;
struct edge
{
    int a,b;
    ll dis;
    bool operator<(const edge & bb)const
    {
        return dis>bb.dis;
    }
};
edge e[maxn*maxn];
void init()
{
    memset(visit,0,sizeof(visit));
    vv.clear();
}
ll getdis(int i,int j)
{
    return (no[i].x-no[j].x)*(no[i].x-no[j].x)+(no[i].y-no[j].y)*(no[i].y-no[j].y);
}
void solve()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        ll x,y;
        cin>>x>>y;
        no[i].x=x;
        no[i].y=y;
    }
    int res=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            res++;
            e[res].a=i;
            e[res].b=j;
            e[res].dis=getdis(i,j);
        }
    }
    sort(e+1,e+1+res);
    ll max_=e[1].dis;
    for(int i=1;i<=res;i++)
    {
        if(visit[e[i].a]||visit[e[i].b])
            continue;
        if(e[i].dis==max_)
        {
            int a=e[i].a;
            int b=e[i].b;
            vv.insert(a);
            vv.insert(b);
        } else
        {
            if(vv.find(e[i].a)!=vv.end()||vv.find(e[i].b)!=vv.end())
                continue;
            for(auto m:vv)
                visit[m]=1;
            vv.clear();
            vv.insert(e[i].a);
            vv.insert(e[i].b);
            max_=e[i].dis;
        }
    }
    for(auto m:vv)
        visit[m]=1;
    int flag=0;
    for(int i=1;i<=n;i++)
    {
        if(visit[i]==0)
        {
            flag=i;
            break;
        }
    }
    if(flag==1)
        cout<<"NO"<<endl;
    else
        cout<<"YES"<<endl;

}
int main() {
    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、付费专栏及课程。

余额充值