2017.08.08小结

来源:互联网 发布:淘宝旺铺智能版教程 编辑:程序博客网 时间:2024/04/29 03:57

第二十二题:

图论kruskal,一般结合并查集进行贪心思想.

先进行排序sort

pre[i]=i头结点赋值

a,b,=find()找到头节点

(a!=b){进行操作,pre[b]=a//合并}

结束.

#include<iostream>

#include<cstdio>

#include<algorithm>

#define N 510

using namespace std;

int n,q,pre[N];

struct point

{

    int x,y,len;

}p[N*N];

int cmp(point x,point y)

{

    return x.len<y.len;

}

int find(int x)

{

    while(x!=pre[x])

        x=pre[x];

    return x;

}

void kruskal()

{

    int i,mix,a,b;

    mix=0;

    sort(p,p+q,cmp);

    for(i=1;i<=n;i++)

    pre[i]=i;

    for(i=0;i<q;i++)

    {

        a=find(p[i].x);

        b=find(p[i].y);

        if(a!=b)

        {

            if(p[i].len>mix)

                mix=p[i].len;

            pre[b]=a;

        }

    }

    cout<<mix<<endl;

}

void input()

{

    scanf("%d",&n);

    q=0;

    for(int i=1;i<=n;i++)

    for(int j=1;j<=n;j++)

    {

                scanf("%d",&p[q].len);

                p[q].x=i;p[q].y=j;

                q++;

    }

}

int main()

{

    int T;

    scanf("%d",&T);

    while(T--)

    {

        input();

        kruskal();

    }

    return 0;

}

练习赛第一题:

题意

AB两个数轮流操作,第i轮对A删除2*i-1的值,对B删除2*i的值,问哪个谁先小于0A先手。

只需要根据等差数列求和列出两个不等式即可:

对于A来说,直到第i轮消耗的数量为:i*i<=a

对于B来说,直到第i轮消耗的数量为:i*(i+1)<=b

因此,只要求最大的iaib即可,二者中小的先消耗光,而相等的时候答案就输出A,因为A先手。

#include<iostream>

#include<cstring>

using namespace std;

long long a,b,x,y;

int main()

{

    cin>>a>>b;

    for(x=0;x*x<=a;x++);

    for(y=0;y*(y+1)<=b;y++);

    if(x<=y) cout<<"Vladik"<<endl;

    else cout<<"Valera"<<endl;

    return 0;

}

第二题:

题意:给出一串数,然后有m个问题,每个问题给出一个区间 【l,r】对区间内的数进行排序,问第x个数的位置是否改变。

 

分析:只需要统计区间内小于 a【x】的数有多少个 然后判断 小于a【x】的数量是否等于 x-l;

#include<iostream>

#include<cstring>

#include<stdio.h>

using namespace std;

int a[500000];

int main()

{

int n,m;

cin>>n>>m;

for(int i=1;i<=n;i++)

cin>>a[i];

for(int i=0;i<m;i++)

{

int l,r,x;

cin>>l>>r>>x;

int ans=a[x];

int num=0;

for(int j=l;j<=r;j++)

{

if(a[j]<ans)

num++;

}

if(num!=x-l)

cout<<"No"<<endl;

else

cout<<"Yes"<<endl;

}

}

 

原创粉丝点击