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;
}