程设2--C语言 10道题


一、前言

给大家放了题解,有些思路不是发的题解,可能有些代码写的并不好有冗余,作者水平不够请见谅,会查重,抄袭后果自负了。看看题解可以,切勿直接提交。先放十道题

二、题解

1.中位数

在这里插入图片描述
代码如下(示例):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//递推题 
#define max 1000
int A[max+5];
int cmp(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}
long long sum=0;
void quanzhi(int l,int r,int quan){
	if(l>r) return ;
		int len=r-l+1;
		int B[len];
		for (int i=l;i<=r;i++) {
        	B[i-l]=A[i];
    	}
    	qsort(B,len,sizeof(int),cmp);
		int k=l;//中位数所在的位置
		int mid1 = len/2;//中位数所在的位置
		int mid=B[mid1];
		for(int i=l;i<=r;i++){
			if(A[i]!=mid){
				k++;
			}else{
				break;
			}
		}
		sum+=A[k]*quan;
		quanzhi(l,k-1,quan+1);
		quanzhi(k+1,r,quan+1); 
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n;
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d",&A[i]);
		}
		sum=0;
		quanzhi(0,n-1,1);	
		printf("%lld\n",sum);
	}
	return 0;
 }

2.加1

在这里插入图片描述

代码如下(示例):

#include <stdio.h>
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n;
		scanf("%d",&n);
		int A[10005];
		int t; 
		int max;//可能是负数 
		for(int i=0;i<n;i++){
			scanf("%d",&t);
			if(i==0) max=t;
			if(max<t){
			 max=t;//最大值 
			}
			A[i]=t; 
		}
		long long cha=max-A[0];//与第一位的差值 
		long long sum=cha;//由于有负数可能爆int 
		//寻找第一个不是顺序排列的数,后面的数最多做前面差值减前面的差值 
		for(int i=1;i<n;i++){
			long long chai=max-A[i];
			if(chai>cha){
				sum+=chai-cha;//找到结点, 
			}
			cha=chai;
		}
		printf("%lld\n",sum); 
	}
	return 0; 
}

3.扁担

在这里插入图片描述

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b){
	return *(int *)a-*(int *)b; 
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n;
		scanf("%d",&n);
		int A[20005];
		int n2=2*n;
		for(int i=0;i<n2;i++){
			scanf("%d",&A[i]);
		}
		qsort(A,n2,sizeof(int),cmp);
		long long sum=0;
		long long t;
		for(int i=0;i<n;i++){
			int k=2*i; 
			t=A[k]-A[k+1];
			sum+=t*t;
		}
		printf("%lld\n",sum);
	}
	return 0;
}

4.众数

在这里插入图片描述

代码如下(示例):

#include <stdio.h>
#include <stdlib.h> 
int cmp(const void *a,const void *b){
	return *(int *)a - *(int *)b; 
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n,k;
		scanf("%d %d",&n,&k);
		int a[n]; 
		for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	qsort(a,n,sizeof(a[0]),cmp); 
	long long sum[n]={0};
	int min=a[0];
	for(int i=0;i<n;i++){
		a[i]=a[i]-min;
	}
	for(int i=1;i<n;i++){
		sum[i]=sum[i-1]+a[i];
	}//前缀和处理   //0 1
	int max=0;
	for(int l=0;l<n;l++){
		for(int r=l+max;r<n;r++){
		int result=r-l+1;
		long long last=(long long)a[r]*(r-l);	
		long long chu=sum[r]-sum[l]+a[l]-a[r];
		long long zeng=last-chu;
		if(zeng<=k){
			if(max<result) max=result;
		}else{
			break;
		} 
	}	
}
	printf("%d\n",max);
}
	return 0;
}

5.数字(加强版)

在这里插入图片描述

代码如下(示例):

#include <stdio.h>
#include <string.h>
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		char A[10005];
		scanf("%s",A);
		int l=strlen(A);
		long long sum=0;
		int t=0;
			for(int i=l-1;i>=0;i--){
			if(A[i]!='0'){
				sum+=A[i]-'0';
				sum++;//去0操作 
				}
			}
			if(A[l-1]=='0') sum++; 
			printf("%lld\n",sum-1);
		}
	return 0;
}

6.游戏

在这里插入图片描述

代码如下(示例):

#include <stdio.h>
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n,m,k;
		scanf("%d %d %d",&n,&m,&k);
		int M[1005]={0};
		int all=0,ming=m,hua=k;
		int t;
		for(int i = 0; i < m; i++){
        scanf("%d",&t);
        M[t]++;
    	}	
    	for(int i = 0; i < k;i++) {
        scanf("%d",&t);
        	if(M[t]!=0){
        		all++;
        		ming--;
        		hua--;
			}
    	}
    	int result=all%2; 
		result+=ming; 
    	//只会最优,优先放对方有的牌,小明先开始
    	if(result>hua){
    		printf("Ming\n");
		}else{
			printf("Hua\n");
		} 
	}
}

7.性价比

在这里插入图片描述

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
typedef struct {
    long long a; 
    long long b;
} xingjia;
int cmp(const void *x, const void *y) {
    xingjia *a1 = (xingjia *)x;
    xingjia *a2 = (xingjia *)y;
    long long left = a1->a * a2->b;
    long long right = a1->b * a2->a;
    if (left < right) return -1;
    if (left > right) return 1;
    return 0;
}
int main(){
	int n;
	scanf("%d",&n);
	xingjia S[n];
	for(int i=0;i<n;i++){
		scanf("%lld",&S[i].a);
	} 
	for(int i=0;i<n;i++){
		scanf("%lld",&S[i].b);
	}
	xingjia small[n];
	int x=0;//小于1的商品 
	xingjia big[n];
	int d=0;//大于1的商品 
	qsort(S,n,sizeof(xingjia),cmp); 
	for(int i=0;i<n;i++){
		long long A1=S[i].a;
		long long A2=S[i].b;
		if(A1<=A2){
			small[x++]=S[i];
		}else{
			big[d++]=S[i];
		}
	} 
	long long sum=0;
	int i=0;
	int j=0;
	while(i<x){
		while(j<d){
			if(big[d-j-1].a * small[i].a <= big[d-j-1].b * small[i].b){
			break;
			}
			j++;
		}
		sum+=j;
		i++;
	}
	long long t=(long long)d*(d-1);
	sum+=t/2;
	printf("%lld\n",sum);
}

8.相同的数

在这里插入图片描述

代码如下(示例):

#include <stdio.h>
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		long long a,c,m,n;
		scanf("%lld %lld %lld %lld",&a,&c,&m,&n);
		int time[m+1]={0};
		int X1[m+1]={0};
		time[0]++;
		long long sum=0;;
		for(int i=1;i<m;i++){
	    sum=a*sum+c;
	    sum%=m;
	    time[sum]++;
		}
		for(int i=0;i<m;i++){
	    X1[i+1]=X1[i]+time[i]; 
		}//差分数组 和 前缀和数组 
		int result=0;
        for(int l=0;l+n<=m;l++){
	     int r=l+n;
		 int t=X1[r]-X1[l];
		 if(result<t){
		 	result=t;
		 	} 
		} 
		printf("%d\n",result);        
	}
	return 0;
}

9.RGB

在这里插入图片描述

代码如下(示例):

#include <stdio.h>
#include <string.h>
int min(int a,int b){
	return a<b?a:b;
} 
int main(int argc, char** argv) {
    int T;
    scanf("%d",&T);
    while(T--) {
        char A[10005];
        char B[10005];
        scanf("%s",A);
        scanf("%s",B);
        int l=strlen(A);
        int X[35]= {0};
        for(int i = 0; i < l; i++) {
            if(A[i]!=B[i])
            {  
                int t=A[i]-B[i]+16;//R=82,G=71,B=66
                X[t]++;//0,5,11 21,27,32//
                //0-32 5-27 11-21 //对应正负 
            }
        }
        int sum=0;
        int x1=min(X[0],X[32]);
        X[0]-=x1; X[32]-=x1; //B-R R-B
        int x2=min(X[5],X[27]);
        X[5]-=x2; X[27]-=x2; //G-R R-G
        int x3=min(X[11],X[21]);
        X[11]-=x3; X[21]-=x3; //B-G G-B   
        //先把两个对应所有能交换的数交换,现在只剩不同的数 
        sum=x1+x2+x3;
        //现在只有3个数组存在了 
        //可以的组合32 5 11   0 27 21 
       if(X[32]!=0){
       	 int x4=min(X[5],X[11]);
       	 int xone=min(X[32],x4);
       	 sum+=2*xone;
       	 X[5]-=xone;X[11]-=xone;X[32]-=xone;
	   }else{
	   	 int x5=min(X[27],X[21]);
       	 int xtwo=min(X[0],x5);
       	 sum+=2*xtwo;
       	 X[0]-=xtwo;X[21]-=xtwo;X[27]-=xtwo;
	   } 
	   sum+=X[5]+X[32]+X[11]+X[0]+X[27]+X[21];
	   printf("%d\n",sum);
        //再把三个对应所有能交换的数交换,最后修改 
    }
    return 0;
}

10.分割

在这里插入图片描述

代码如下(示例):

#include <stdio.h>
#include <math.h>
#define N 1000000007
int A[100005];
long long fenge(int l,int r){
	if(l==r)
	return A[l]%N;
	int n=r-l+1;
	int m=(l+r)/2; 
	if(n%2!=0){
	    long long L=fenge(l,m-1);
	    long long R=fenge(m+1,r);
	    long long t=L*L-R*R;
		t%=N; 
		t=abs(t);
		t*=A[m];
		t%=N;
		return t;
	}else{
		long long L=fenge(l,m);
	    long long R=fenge(m+1,r);
		long long t=(long long)L*R;
		t%=N;
		return t;
	}
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&A[i]);
		}
		long long sum=fenge(1,n);
		printf("%lld\n",sum);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值