天梯赛 2.9

L2-005 集合相似度

#include<bits/stdc++.h>
#include<set>
using namespace std;
int n, m, k;
int num, a, b;
int c, t;
int i, j;
double sum;
set<int>s[55];
int main()
{
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
    {
        scanf("%d", &m);
        for (j = 1; j <= m; j++)
        {
            scanf("%d", &num);
            s[i].insert(num);
        }
    }
    scanf("%d", &k);
    for (i = 0; i < k; i++)
    {
        c = 0;
        scanf("%d %d", &a, &b);
        for (set<int>::iterator it = s[a].begin(); it != s[a].end(); it++) {
            if (s[b].count(*it) == 1) 
            {
                c++;
            }
        }
        t = s[b].size() + s[a].size() - c;
        sum = 1.0 * c / t * 100;
        printf("%.2lf%%\n", sum);
    }
    return 0;
}

L2-006 树的遍历

#include <stdio.h>
#include <stdlib.h>
typedef struct node* bintree;
typedef struct node{
	bintree left;
	bintree right;
	int data;
}tree;
bintree creat(int n,int a[],int b[]){
	bintree p;
	int i;
	if(n==0){
		return NULL;
	}else{
		p=(bintree)malloc(sizeof(tree));
		p->data=a[n-1];
		for(i=0;i<n;i++){
			if(a[n-1]==b[i]){
				break;
			}
		}
		p->left=creat(i,a,b);
		p->right=creat(n-1-i,a+i,b+i+1);
	}
	return p;
}
void pp(bintree bt){
	int front=0,rear=1;
	bintree p=bt,t[60];
	t[0]=bt;
	while(front<rear){
		if(t[front]!=NULL){
			p=t[front];
			if(p==bt){
				printf("%d",t[front]->data);
			}else{
				printf(" %d",t[front]->data);
			}
			t[rear++]=p->left;
			t[rear++]=p->right;
		}
		front++;
	}
}
int main(){
	bintree a;
	int n,last[30],mid[30],i,j;
	scanf("%d",&n); 
	for(i=0;i<n;i++){
		scanf("%d",&last[i]);
	}
	for(i=0;i<n;i++){
		scanf("%d",&mid[i]);
	}
	a=creat(n,last,mid);
	pp(a);
} 

L2-007 家庭房产

#include<stdio.h>
#include<string.h>
int a[1010][100],n;
void putfun(int a[][2],double b[][2],int m,int j)//每次只输出最大的数,毁掉原来最大数 
{
    int i,t;
    for(i=1;i<m;i++)
    {
	    if(b[i][1]>b[j][1]&&b[i][1]!=-1)j=i;
		else if(b[i][1]==b[j][1]&&a[i][1]>a[j][1])j=i;//特殊情况处理 
		   
	}
	printf("%04d %d %.3lf %.3lf\n",a[j][0],a[j][1],b[j][0],b[j][1]);
	b[j][1]=-1;
}
int rfun(int a[],int s)//求出家庭的人数 
{
    int i,j,k; 
    for(i=0;i<s;i++)
      for(j=i+1;j<s;j++)
        if(a[j]==a[i])
        {
          for(k=j+1;k<s;k++)a[k-1]=a[k];
          s--;
        }   
    return s;
}
void pfun(int num,int k)//递归求出几个家族 
{
   int i,j,x;
   for(i=0;i<n;i++)
     for(j=2;j<a[i][1]-2;j++)
	    if(a[i][j]==num&&j!=5&&a[i][j]!=-1&&a[i][0]==0)
		{	 
		    a[i][0]=k;
            for(x=2;x<a[i][1]-2;x++)
	          if(x!=5&&a[i][x]!=-1)pfun(a[i][x],k);
		}
}
int main()
{
    int i,j,count,k=0,min=10000,s,sumF,sumS;
    int rnum[1010],ren[1010][2];
    double ave[1010][2];
	scanf("%d",&n);
    for(i=0;i<n;i++)
    {
       j=0;	
       a[i][0]=0;
	   scanf("%d %d %d",&a[i][2],&a[i][3],&a[i][4]);
	   scanf("%d",&a[i][5]);     //儿子的个数
	   j=6;
	   count=a[i][5];
	   while(count)
	   {
	      scanf("%d",&a[i][j++]);
	      count--;
	   } 
	   scanf("%d %d",&a[i][j],&a[i][j+1]);
	   a[i][1]=j+2;
    }
    k=0;//家族数目K 
    for(i=0;i<n;i++)if(a[i][0]==0){k++;pfun(a[i][2],k);}
    printf("%d\n",k);
    for(count=1;count<=k;count++)
	{
	  min=10000;
	  memset(rnum,0,sizeof(rnum)); 
	  sumF=sumS=s=0;
      for(i=0;i<n;i++)
      {
	    if(a[i][0]==count)
	    {
		   for(j=2;j<a[i][1]-2;j++)
	          if(j!=5&&a[i][j]!=-1)
	          {
	             if(a[i][j]<min)min=a[i][j];
	             rnum[s++]=a[i][j];
	          }
	          sumF+=a[i][a[i][1]-2];
	          sumS+=a[i][a[i][1]-1];
		}
      } 
 	  ren[count][0]=min;                   //家庭成员的最小编号 
 	  ren[count][1]=rfun(rnum,s);          //家庭人口数 
 	  ave[count][0]=sumF*1.0/ren[count][1];//人均房产套数 
 	  ave[count][1]=sumS*1.0/ren[count][1];//人均房产面积 
    }
    for(i=1;i<=k;i++)putfun(ren,ave,count,i);
    return 0;
}

L2-008 最长对称子串

#include<stdio.h>
#include<string.h>
int main()
{
    char str[1050];
    gets(str);
    int max,i,j,k,n;
    max=1;
    n=strlen(str);
    
    for(i=0;i<=n;i++)
    {
        for(j=n;j>i;j--)
        {
            if(str[i]==str[j])
            {
                for(k=0;i+k<=j-k;k++)
                {
                    if(i+k<j-k)
                    {
                        if(str[i+k]==str[j-k])
                        {
                            if(i+k+1==j-k)
                            {
                                if(max<j-i+1)
                                    max=j-i+1;
                            }
                            else
                            	continue;
                        }
                        
                        else
                            break;
                    }
                    
                    else{
                        if(max<j-i+1)
                            max=j-i+1;
                    }
                }
            }
        }
    }
        printf("%d",max);
}

 

L2-009 抢红包

 

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>
#define MAX_N 10000
int arr[MAX_N] = { 0 };
int num[MAX_N] = { 0 };
int compare(const void *a, const void *b) {
    int idx_a = *(int *)a;
    int idx_b = *(int *)b;
  
    if (arr[idx_a] != arr[idx_b]) {  
        return arr[idx_b] - arr[idx_a];
    } else if (num[idx_a] != num[idx_b]){
        return num[idx_b] - num[idx_a];
    } else {  
        return idx_a - idx_b; // 升序排列  
    }  
}  
  
int main() {  
    int N;  
    scanf("%d", &N);  
  
    for (int i = 0; i < N; i++) {  
        int a;  
        scanf("%d", &a);  
        for (int j = 0, b, c; j < a; j++) {  
            scanf("%d %d", &b, &c);  
            num[b - 1] += 1;  
            arr[b - 1] += c;  
            arr[i] -= c;  
        }  
    }
    int ind[MAX_N];  
    for (int i = 0; i < N; i++) {  
        ind[i] = i;
    }
    qsort(ind, N, sizeof(int), compare);  
    for (int i = 0; i < N; i++) {  
        printf("%d %.2lf\n", ind[i] + 1, (double)arr[ind[i]] / 100);  
    }
    return 0;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值