ACM暑期集训31

组队训练赛第三场

题目连接传送门

标记排序即可

#include<stdio.h>
#include<algorithm>
using namespace std;
struct ab
{
 int a[101];
 int mark,cnt;
};
ab cd[101];
bool cmp(ab a,ab b)
{
 if(a.cnt>b.cnt||a.cnt==b.cnt&&a.mark<b.mark) return 1;
 else return 0;
}
int main()
{
 int i,j,n,m,mm[101];
 while(scanf("%d%d",&n,&m)!=EOF)
 {
  for(i=0;i<m;i++)
   scanf("%d",&mm[i]);
  for(i=0;i<n;i++)
  {
  	cd[i].mark=i+1;
  	cd[i].cnt=0;
  	for(j=0;j<m;j++)
  	{
  	 scanf("%d",&cd[i].a[j]);
	 if(cd[i].a[j]>=mm[j]) cd[i].cnt++;
	}   
  }
  sort(cd,cd+n,cmp);
  printf("%d\n",cd[0].mark);
 }
}

题目连接传送门

分析:

先按照W排序,对于每一条边,如果他父结点的子结点个数>=k那么就将这条边作为另一棵树的边,否则就将该结点加入该树

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
const int maxn=1e5+4;
struct node{
    int u,v,w;
}e[maxn];
map<int,int> s;
int p[maxn],ans;
bool cmp(int a,int b){
    return e[a].w<e[b].w;
}
int main()
{
    int n,m;
    while(cin>>n>>m){
        ans=0;
        s.clear();
        for(int i=0;i<n;i++){
            cin>>e[i].u>>e[i].v>>e[i].w;
            p[i]=i;
        }
        sort(p,p+n,cmp);
        for(int i=0;i<n;i++){
            int x=e[p[i]].u,y=e[p[i]].v;
            if(s[x]<=0){
                s[x]+=m-1;
                s[y]+=m;
                ans++;
            }
            else{
                s[x]--;
                s[y]+=m;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

题目连接 传送门

分析 将时间排序后 讨论a[k] 与t的大小关系,分多种情况讨论即可

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int a[100010];

bool cmp(int a,int b)
{
    return a<b;
}
int main()
{
    int n,k,t;
    while(~scanf("%d%d%d",&n,&k,&t))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+1+n,cmp);
        if(t==0)
        {
            if(k!=n) printf("-1\n");
            else printf("0\n");
        }
        else
        {
            if(a[k]==t)
            {
                if(k==n) printf("0\n");
                else if (k==1)
                {
                    printf("1\n");
                }
                else
                {
                    int i=k,cnt=0;
                    while(i>=1&&a[i]==a[k]) i--,cnt++;
                    printf("%d\n",cnt);
                }

             }
            else
            {
                if(k==n) printf("0\n");
                else if(k==1)
                {
                    if(a[1]<a[2]) printf("0\n");
                    else
                    {
                        if(a[1]!=0) printf("1\n");
                        else
                        {
                            int i=2,cnt=0;
                            while(i<=n&&a[i]==a[1]) cnt++,i++;
                            printf("%d\n",cnt);
                        }
                    }
                }
                else
                {
                    int ans=1e9+10;
                    if(a[k]<a[k+1]) ans=0;
                    else
                    {
                        int i=k+1,cnt1=0,j=k,cnt2=0;
                        while(i<=n&&a[i]==a[k]) cnt1++,i++;
                        while(j>=1&&a[j]==a[k]) cnt2++,j--;
                        if(a[k]==0) ans=min( ans,cnt1);
                        else ans=min( ans,min(cnt1,cnt2) );
                    }
                    if(a[k-1]==0)
                    {
                        if(a[k-1]<a[k])
                        {
                            if(a[k]<a[k+1]) ans=0;
                            else ans=(1,ans);
                        }
                        else
                        {
                            int i=k+1,cnt=0;
                            while(i<=n&&a[i]==a[k]) i++,cnt++;
                            ans=min(ans,cnt);
                        }
                    }
                    else
                    {
                        if(a[k-1]<a[k])
                        {
                            if(a[k]<a[k+1]) ans=0;
                            else ans=(1,ans);
                        }
                        else
                        {
                            int i=k+1,cnt1=0,j=k,cnt2=0;
                            while(a[i]==a[k]&&i<=n) i++,cnt1++;
                            while(a[j]==a[k]&&j>=1) j--,cnt2++;
                            ans=min(ans, min(cnt1,cnt2) );
                        }
                    }
                    printf("%d\n",ans);
                }
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41383801/article/details/82155768