admin管理员组

文章数量:814255

2022天梯选拔补题1

7-1 计算前40项之和 (5 分)

 

解题思路:

        简单的输出题。观察题目中的式子,不难发现,每一项的分子是相等的,而分母则有一定的规律。以1为第一项,每一项的分母为该项数。且偶数项的要乘以-1.。每一项用公式表示为:((-1)^n)*(1/n)     n(项数)。

我这里将奇偶分开计算,免去了乘以(-1)^n这一步。

代码:

#include<stdio.h>int main()
{float ans=0;for(float i=1;i<=40;i++){if((int)i%2==0){ans-=1/i;}else {ans+=1/i;}}printf("%.4f",ans);return 0;
}

 

7-2 主对角线、副对角线之和 (5 分)

 解题思路:

        计算对角线。主对角线为i=j时,数组处于主对角线;副对角线为i=n-j-1时,数组处于副对角线。

代码:

#include<stdio.h>int main()
{int N;scanf("%d",&N);int s[N][N];int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){scanf("%d",&s[i][j]);}}int sum=0;for(i=0;i<N;i++){for(j=0;j<N;j++){if(j==i||j==N-i-1){sum+=s[i][j];}}}printf("%d",sum);return 0;
}

 

7-3 最短购物距离 (10 分)

解题思路:

         发现数据开的比较小。可以直接暴力解。for循环计算出以每一个商店为起点的购物距离。找到最小距离。

代码:

#include<stdio.h>int main()
{int t;scanf("%d",&t);for(int i=0;i<t;i++){int jsq=0,min=99999999;int n;scanf("%d",&n);int a[n];for(int j=0;j<n;j++){scanf("%d",&a[j]);}for(int j=0;j<n;j++){for(int k=0;k<n;k++){if(j==k) continue;if(a[j]-a[k]<0)jsq+=a[k]-a[j];else jsq+=a[j]-a[k];}if(min>jsq*2)min=jsq*2;jsq=0;}printf("%d\n",min);}return 0;
}

 

7-4 结构体应用:计算总分及最高分 (10 分)

集体思路:

        用结构体,存下全部信息,并加一项来存总成绩。记录人数,将所有总分加起来,算出总平均分。再用排序找出总分最大值,输出最高分的这个人的信息。(埋个坑,这次写题用的是选择排序,因为我还不会改快排函数。过段时间补起来)。

代码:

#include<stdio.h>struct node{int number;char name[10];int c1,c2,c3,zf;
};int main()
{int n;double sum=0;scanf("%d",&n);struct node xs[n],t;for(int i=0;i<n;i++){scanf("%d",&xs[i].number);scanf("%s",xs[i].name);scanf("%d%d%d",&xs[i].c1,&xs[i].c2,&xs[i].c3);xs[i].zf=xs[i].c1+xs[i].c2+xs[i].c3;sum+=xs[i].zf;}sum/=(n*3);for(int i=0;i<n;i++){printf("%d %s %d %d %d %d\n",xs[i].number,xs[i].name,xs[i].c1,xs[i].c2,xs[i].c3,xs[i].zf);}for(int i=0;i<n;i++){for(int j=1;j<n;j++){if(xs[i].zf<xs[j].zf){t=xs[i];xs[i]=xs[j];xs[j]=t;}}}printf("总平均分=%lf\n",sum);printf("%d %s %d %d %d %d",xs[0].number,xs[0].name,xs[0].c1,xs[0].c2,xs[0].c3,xs[0].zf);return 0;
}

 

7-5 最小回文素数 (15 分)

集体思路:

        数据比较小,所以没有用埃氏筛素数。直接暴力枚举可以找到素数。然后判断是否为回文数。这里我先将原数的每一位数分离,然后倒过来重组。比较原数与重组后的数,若相同则输出。

代码:

#include<stdio.h>
#include<math.h>int main()
{int T;scanf("%d",&T);for(int i=0;i<T;i++){int n;scanf("%d",&n);for(int j=n+1;j<100000;j++){int k;for(k=2;k<j;k++){if(j%k==0)break;}if(k!=j) continue;int t=j;int s[6];int o=0;while(t!=0){s[o++]=t%10;t/=10;}int jsq=0;for(k=0;k<o;k++){jsq=jsq+s[k]*pow(10,o-k-1);}if(jsq==j){printf("%d\n",j);break;}}}return 0;
}

 

7-6 最长上升子序列 (15 分)

解题思路:

        在比赛的时候没有理解题意,以为需要为递增数列。而且我还重新排序了数组。。。

        我是直接暴力搜索出来的结果。先依次以一个数为起点,进入循环,若满足递增则继续递归下一个(这里记得要用book数组标记,防止重复搜索),反之回溯。记录最大的单调递增子序列。

        其实这道题的最优解为动态规划。但是我的动态规划思想很拉,开始没想到。。。

        (再埋个坑,过段时间把动态规话补上)

代码:

#include<bits/stdc++.h>
using namespace std;int Max=0;
int N;
int a[1010];
int q=999999;
void dfs(int j,int jsq)
{if(jsq>Max){Max=jsq;}for(int i=j+1;i<N;i++){if(a[i]-a[j]>0){dfs(i,jsq+1);}}}int main()
{scanf("%d",&N);for(int i=0;i<N;i++){scanf("%d",&a[i]);}//sort(a,a+N);//if(N==1){printf("1");return 0;}for(int i=0;i<N;i++){for(int j=i+1;j<N;j++){q=a[j]-a[i];if(q<=0) continue;dfs(j,2);}}printf("%d",Max);return 0;
}

 

7-7 h0093. 字符串最大跨距 (20 分)

输入样例:

abcd123ab888efghij45ef67kl,ab,ef

输出样例:

18

解题思路:

        先全部存入一个字符串数组,通过之间的逗号分离出三个字符串S,S1,S2。这里的数据比较小,可以直接暴力枚举(还好不要KMP)。找到第一次出现S1和最后一次出现S2的位置,计算出之间的距离。

代码:

#include<stdio.h>
#include<string.h>int main()
{char s[301],s1[11],s2[11];for(int i=0;;i++){scanf("%c",&s[i]);if(s[i]==',')break;}for(int i=0;;i++){scanf("%c",&s1[i]);if(s1[i]==',')break;}scanf("%s",s2);int slen = strlen(s);int s1len = strlen(s1)-2;int s2len = strlen(s2);int jsq=0;int left,right=0;int i,j;for(i=0;i<slen;i++){for(j=0;j<s1len;j++){if(s[i+j]==s1[j])jsq++;}if(jsq==s1len)break;jsq=0;}jsq=0;left=i+j;for(i=0;i<slen;i++){for(j=0;j<s2len;j++){if(s[i+j]==s2[j])jsq++;}if(right<i&&jsq==s2len) right=i;jsq=0;}printf("%d",right-1-left);return 0;
}

 

 

 

 

 

csdn停更了足足两个月,我又回来了。

 

 

 

 

 

 

 

 

本文标签: 2022天梯选拔补题1