PTA-排序专题

7-3 奥运排行榜 (25分)

#include
#include
#include
using namespace std;
struct node
{
    int gold,medal,people;
    double x,y;

}s[100010];
int main()
{

    int N,M,i,j,minn=255,index=0;
    scanf("%d%d",&N,&M);
    for(i=0;i<N;i++)
    {
        scanf("%d %d %d",&s[i].gold,&s[i].medal,&s[i].people);
        s[i].x=s[i].gold*1.0/s[i].people;
        s[i].y=s[i].medal*1.0/s[i].people;
    }
    for(i=0;i<M;i++)
    {
        int a[4]={1,1,1,1},p;
        scanf("%d",&p);
        for(j=0;j<N;j++)
        {//数字最小的那种方式,排名最靠前
            if(s[j].gold>s[p].gold)
                a[0]++;
            if(s[j].medal>s[p].medal)
                a[1]++;
            if(s[j].x>s[p].x)
                a[2]++;
            if(s[j].y>s[p].y)
                a[3]++;

        }
        for(j=0;j<4;j++)
        {
            if(a[j]<minn)
            {
                minn=a[j];
                index=j+1;
            }
        }
        if(i==0)
            printf("%d:%d",minn,index);
        else
            printf(" %d:%d",minn,index);
        minn=255;
    }
    return 0;
}

7-4 抢红包 (25分)

#include
#include
#include
using namespace std;
struct node
{
    double data;//money
    int Glnum;//抢到红包数
    int num;//编号
}p[10000];
int cmp(struct node a,struct node b)
{
    return a.data>b.data;
}

int main()
{
int n;
scanf("%d",&n);
for(int k=1;k<=n;k++)
    {
        p[k].num=k;
        p[k].data=0;
        p[k].Glnum=0;
    }
    for(int i=1;i<=n;i++)
    {
        int k;
        scanf("%d",&k);
        for(int j=0;j<k;j++)
        {
            int a;
            double b;
            scanf("%d%lf",&a,&b);
            p[a].data+=b;
            p[a].Glnum++;
            p[i].data-=b;
        }
    }
    sort(p+1,p+n+1,cmp);
for(int q=1;q<n;q++)
{
    if(p[q].data==p[q+1].data)
    {
        if(p[q].Glnum<p[q+1].Glnum)
            {
                swap(p[q],p[q+1]);
            }
        else if(p[q].Glnum==p[q+1].Glnum)
        {
            if(p[q].num>p[q+1].num)
            {
                swap(p[q],p[q+1]);
            }
        }

    }
    printf("%d %.2lf\n",p[q].num,p[q].data/100);
}
printf("%d %.2lf\n",p[n].num,p[n].data/100);
    return 0;
}

7-5 互评成绩 (25分)

#include 
#include
#include
using namespace std;
int main()
{
    int n,k,m,j=0,i;
    cin>>n>>k>>m;
    double score[k];
    double s[n]={0},h[n]={0};
    int p=n;
    while(p--)
    {
    for(i=0;i<k;i++)
    {
    cin>>score[i];

    }
    sort(score,score+k);
    for(i=1;i<k-1;i++)
    {
    s[j]+=score[i];
    }
    h[j]=s[j]/(double)(k-2);
    j++;
    }
    sort(h,h+n);
    for(i=n-m;i<n;i++)
    {
    if(i==n-m)
    printf("%.3lf",h[i]);
    else
    printf(" %.3lf",h[i]);
    }
    return 0;
}

7-7 人以群分 (25分)

#include 
 
using namespace std;
 
bool cmp( int  a, int b)
{
    return a>b;
}
int main()
{
    int n;
    int a[100010];
    int i,j,k,sum1,sum2,x,y,sum;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
    }
    sort(a+1,a+n+1,cmp);
    if(n%2==0)
    {
        x=n/2;
        y=n/2;
    }
    else
    {
        x=n/2+1;
        y=n/2;
    }
    sum1=sum2=0;
    for(i=1;i<=x;i++)
    {
        sum1=sum1+a[i];
    }
    for(i=x+1;i<=n;i++)
    {
        sum2=sum2+a[i];
    }
    sum=abs(sum1-sum2);
    printf("Outgoing #: %d\n",x);
    printf("Introverted #: %d\n",y);
    printf("Diff = %d\n",sum);
    return 0;
}

7-8 悄悄关注 (25分)

#include
#include
#include
#include
#include
using namespace std;
int n,m,ave,sum=0;
map<string,int> mp,sdf;
string ss[10005],re[10005];
bool cmp(string a,string b){
	return a<b;
}
int main()
 { scanf("%d",&n);
	int a;
	string s;
	for(int i=0;i<n;i++){
		cin>>s;
		mp[s]=1;
	}
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		cin>>ss[i]>>a;
		sdf[ss[i]]=a;
		sum+=a;
	}
	int num=0;
	ave=sum/m;
	//cout<
	for(int i=0;i<m;i++){
		if(sdf[ss[i]]>ave&&mp[ss[i]]==0)
		re[num++]=ss[i];
	}
	if(num==0){
		cout<<"Bing Mei You\n";
	}
	else {
		sort(re,re+num,cmp);
		for(int i=0;i<num;i++){
			cout<<re[i]<<endl;
		}
	}
	return 0;
}

7-1 模拟EXCEL排序 (25分)

#include
#include
#include
#include
#include
using namespace std;
struct Excel
{
    int data;
    char s[10];
    int score;
}p[100001];
int cmp1(struct Excel a,struct Excel b)
{
    return a.data<b.data;
}
int cmp2(struct Excel a,struct Excel b)
{if(strcmp(a.s,b.s)==0)
    return a.data<b.data;
else
    return strcmp(a.s,b.s)<0;
}
int cmp3(struct Excel a,struct Excel b)
{if(a.score==b.score)
    return a.data<b.data;
else
    return a.score<b.score;
}
int main()
 { int n,c;
 scanf("%d%d",&n,&c);
 for(int i=0;i<n;i++)
 {
     scanf("%d %s %d",&p[i].data,p[i].s,&p[i].score);
 }
 if(c==1)
    sort(p,p+n,cmp1);
 else if(c==2)
    sort(p,p+n,cmp2);
 else if(c==3)
    sort(p,p+n,cmp3);
    for(int i=0;i<n;i++)
    {
        if(i==n-1)
            printf("%06d %s %d",p[i].data,p[i].s,p[i].score);
        else
            printf("%06d %s %d\n",p[i].data,p[i].s,p[i].score);
    }
	return 0;
}

7-2 魔法优惠券 (25分)

#include 
#include 
#include 
#include 
using namespace std;

int main()
{
    int n,sum=0,i,s,ha,hb,j;
    scanf("%d",&n);
    int a[n];
    for(i=0;i<n;i++)
    {
    scanf("%d",&a[i]);

    }
    sort(a,a+n);
    int m;
    scanf("%d",&m);
    int b[m];
    for(i=0;i<m;i++)
    {
    scanf("%d",&b[i]);
    }
    sort(b,b+m);
    if(n==m)
    {for(i=0;i<n;i++)
    {

    s=a[i]*b[i];
    if(s>0)
    sum+=a[i]*b[i];
    }
    }
    else
    {for(i=0;i<n;i++)
    {if(a[i]>0)
    {ha=i;
    break;
    }
    }
    if(i==n)
    ha=n;
    for(i=0;i<m;i++)
    {if(b[i]>0)
    {   hb=i;
        break;
    }
    }
    if(i==m)
    hb=m;
    for(i=0,j=0;i<ha&&j<hb;i++,j++)
    {s=a[i]*b[j];
    if(s>0)
    sum+=a[i]*b[j];
    }
    for(i=n-1,j=m-1;i>=ha&&j>=hb;i--,j--)
    {
    s=a[i]*b[j];
    if(s>0)
    sum+=a[i]*b[j];
    }
    }
    printf("%d",sum);
    return 0;
}

7-6 集合相似度 (25分)
Nc(交集)
Nt(并集)
set用法1
set用法2

#include
#include
using namespace std;
 
 
set<int> g[55];//不会有重复数字
int main()
{
 
    int i,m,k,n;
    int x,y;
    while(~scanf("%d",&n))
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&k);
            while(k--)
            {
                scanf("%d",&x);
                g[i].insert(x);
            }
        }
        scanf("%d",&m);
        while(m--)
        {
            set<int>::iterator it;
            scanf("%d%d",&x,&y);
            int ans=0;
            for(it=g[x].begin();it!=g[x].end();it++)
            {
                if(g[y].find(*it)!=g[y].end())//没有找到相同的值的时候,就会返回end(),找到相应的值会返回地址
                    ans++;
            }
            int sum=g[x].size()+g[y].size();
            sum-=ans;
            double cnt=1.0*ans/sum*100;
            printf("%.2lf%\n",cnt);
        }
    }
    return 0;
}

你可能感兴趣的:(PTA-排序专题)