一、前言
给大家放了题解,有些思路不是发的题解,可能有些代码写的并不好有冗余,作者水平不够请见谅,会查重,抄袭后果自负了。看看题解可以,切勿直接提交。先放十道题
二、题解
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);
}