2021天梯赛训练-2
7-1 计算指数
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
printf("2^%d = %.0lf",n,pow(2,n));
}
7-2 求整数段和
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,l=0;
cin >> a >> b ;
for(int i=a;i<=b;i++)
{
cout <<setw(5)<<right<<i;
l++;
if(l==5)
{
cout << endl;
l=0;
}
}
if(l!=0)
cout << endl;
cout << "Sum = "<< (a+b)*(b-a+1)/2 << endl;
}
7-3 比较大小
#include<bits/stdc++.h>
using namespace std;
void change (int* a,int* b)
{
int p;
p=*a;
*a=*b;
*b=p;
}
int main()
{
int a,b,c;
int p;
cin >> a >> b >> c ;
if(a>b)
{
change(&a,&b);
if(b>c) change(&b,&c);
if(a>b) change(&a,&b);
}
else if(b>c)
{
change(&b,&c);
if(a>b) change(&a,&b);
}
cout << a << "->" << b << "->" << c <<endl;
}
7-4 计算阶乘和
#include<bits/stdc++.h>
using namespace std;
int Fact(int n)
{
int i;
int sum=1;
for(i=2;i<=n;i++) sum*=i;
return sum;
}
int main()
{
int N,i;
int sum=0;
cin >> N ;
for(i=1;i<=N;i++) sum+=Fact(i);
cout << sum << endl;
return 0;
}
7-5 N个数求和
#include<bits/stdc++.h>
using namespace std;
int hcf(int m,int n)
{
while(n!=0)
{
int r = m%n;
m=n;
n=r;
}
return m;
}
int main()
{
int N,i;
int a,b,sumfz,sumfm,divisor,lcm;
scanf("%d %d/%d",&N,&sumfz,&sumfm);
divisor=hcf(abs(sumfz),abs(sumfm));
if(divisor) {sumfz/=divisor; sumfm/=divisor;}
for(i=1;i<N;i++)
{
scanf("%d/%d",&a,&b);
lcm=sumfm*b/hcf(sumfm,b);
sumfz=sumfz*lcm/sumfm+a*lcm/b;
sumfm=lcm;
divisor=hcf(abs(sumfz),abs(sumfm));
if(divisor)
{
sumfz/=divisor;
sumfm/=divisor;
}
}
if (sumfz&&sumfz/sumfm== 0) printf("%d/%d\n",sumfz,sumfm);
else if (sumfz%sumfm == 0) printf("%d\n",sumfz/sumfm);
else printf("%d %d/%d\n",sumfz/sumfm,sumfz%sumfm,sumfm);
return 0;
}
7-6 A-B
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k;
char A[10001];
char B[10001];
gets(A);
gets(B);
for(i=0;A[i]!='\0';i++)
{
for(j=0;B[j]!='\0';j++)
{
if(A[i]==B[j])
{
for(k=i;A[k]!='\0';k++)
{
A[k]=A[k+1];
}
i--;
}
}
}
puts(A);
return 0;
}
7-7 悄悄关注
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
char name[5];
int great;
}Stu;
int cmp(const void* a,const void* b)
{
return strcmp((char *)a,(char *)b);
}//按字典顺序排序字符串
int Bsearch(char x[][5],int low,int high,char key[]){
int mid;
while(low<=high){
mid=(low+high)/2;
if(strcmp(x[mid],key)==0)
return mid;
else if(strcmp(x[mid],key)>0)
high=mid-1;
else
low=mid+1;
}
return -1;
}//二分查找查看是否在关注列表
int main()
{
int N,M,aver=0;
int i,j,k;
scanf("%d",&N);
char Follow[N][5];
for(i=0;i<N;i++) scanf("%s",Follow[i]);
qsort(Follow,N,sizeof(Follow[0]),cmp);
scanf("%d",&M);
Stu is[M];
for(i=0;i<M;i++)
{
scanf("%s %d",&is[i].name,&is[i].great);
aver+=is[i].great;
}
qsort(is,M,sizeof(is[0]),cmp);
aver/=M;
int flag=0;
for(i=0;i<M;i++)
{
if(is[i].great>aver)//如果大于点赞平均数
{
if(Bsearch(Follow,0,N,is[i].name)==-1)//如果不在关注列表
{
flag=1;
printf("%s\n",is[i].name);
}
}
}
if(flag==0) printf("Bing Mei You");
}
7-8 点赞狂魔
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char name[9];//用户名
int aver;//标签平均出现次数
int picksum;//标签不重复的点赞数
}User;
int ifin(int x[],int n,int flag);//判断x中是否有n,flag为当前x中被计入的标签数
void sort(User x[],int n);//这道题用冒泡也不会超时
int main()
{
int N,K;
scanf("%d",&N);
User blog[N];
int i,j,k;
int flag,p;
int*x;
for(i=0;i<N;i++)
{
scanf("%s %d",&blog[i].name,&K);
x=(int*)malloc(sizeof(int)*K);
blog[i].aver=K;
flag=0;
for(j=0;j<K;j++)
{
scanf("%d",&p);
if(ifin(x,p,flag))
{
x[flag]=p;
flag++;
}
}
blog[i].picksum=flag;
x+flag==NULL;
free(x);
}
sort(blog,N);
printf("%s",blog[0].name);
if(N<3) //点赞狂魔不超过三人的情况
{
for(i=1;i<N;i++) printf(" %s",blog[i].name);
for(i=N;i<3;i++) printf(" -");
}
else for(i=1;i<3;i++) printf(" %s",blog[i].name);
printf("\n");
return 0;
}
int ifin(int x[],int n,int flag)
{
int i;
for(i=0;i<flag;i++)
{
if(x[i]==n) return 0;
}
return 1;
}
void sort(User x[],int n)
{
User p;
int i,j,swap;
for(i=0;i<n-1;i++)
{
swap=0;
for(j=0;j<n-1-i;j++)
{
if(x[j].picksum<x[j+1].picksum||(x[j].picksum==x[j+1].picksum&&(x[j].aver>x[j+1].aver)))
//按题目要求排序
{
p=x[j];
x[j]=x[j+1];
x[j+1]=p;
swap=1;
}
}
if(swap==0) return ;
}
}
7-9 分而治之
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int start;
int end;
}edge;
int main()
{
int N,M,K,Np,v;
int i,j,k;
int*map;//记录攻略方案
scanf("%d %d",&N,&M);
edge e1[M];
for(i=0;i<M;i++) scanf("%d %d",&e1[i].start,&e1[i].end);
scanf("%d",&K);
for(i=0;i<K;i++)
{
scanf("%d",&Np);
map=(int*)malloc(sizeof(int)*(N+1));
for(j=0;j<=N;j++) map[j]=0;
for(j=0;j<Np;j++)
{
scanf("%d",&v);
map[v]=1;
}
for(j=0;j<M;j++)//当所有路径的起点或终点都被攻下时(在map中的值为1),剩下的城市孤立无援
{
if(map[e1[j].start]!=1&&map[e1[j].end]!=1)//任一一条路不满足条件,即方案不可行
{
printf("NO\n");
break;
}
}
if(j==M) printf("YES\n");
free(map);
}
}
7-10 名人堂与代金券
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
char name[20];
int score;
}Stu;
int cmp(const void *a,const void *b){
Stu *c=(Stu *)a;
Stu *d=(Stu *)b;
if(c->score!=d->score) return d->score-c->score;//成绩非升序排列
else return strcmp(c->name,d->name);//用户名字典排序
}//结构体Stu的二级排序
int main()
{
int N,G,K;
int i,j,k;
int sum=0;
scanf("%d %d %d",&N,&G,&K);
Stu s1[N];
for(i=0;i<N;i++)
{
scanf("%s %d",&s1[i].name,&s1[i].score);
if(s1[i].score>=G) sum+=50;
else if(s1[i].score>=60) sum+=20;
}
qsort(s1,N,sizeof(s1[0]),cmp);
printf("%d\n",sum);
int flag=0,No=1;
i=0;
while(No<=K)
{
printf("%d %s %d\n",No,s1[i].name,s1[i].score);
if(s1[i].score==s1[i+1].score)//如果i的成绩与i+1相同,No不变,继续输出
{
flag++;//记录并列人数
}
else //当i的成绩与i+1不同时,No+1+上一名次并列人数
{
No++;
No+=flag;
flag=0;
}
i++;
}
return 0;
}
7-11 特立独行的幸福
#include<stdio.h>
#include<stdlib.h>
int n1[10001],n2[10001];
int isprime(int a)
{
int i;
for(i=2;i<a;i++)
if(a%i==0) return 0;
return 1;
}//是否素数
int ishappy(int i,int n)
{
int sum=0;
while(n){
sum+=(n%10)*(n%10);
n/=10;
}
if (n2[sum]==1) return 0;//当sum在之前的迭代出现过的时候,陷入循环,不是幸福数,退出
n1[sum]=1;//将依附于该数的sum在n1中置1,以证明非特立独行
n2[sum]=1;//将依附于该数的sum在n2中置1,以证明出现过出现过一次
if(sum==1) return i;
else return ishappy(i+1,sum);
}//判断是否幸福数并返回依附于n的幸福数的个数i
void clear_zero(int arr[],int n){
int i;
for(i=0;i<n;i++) arr[i]=0;
}//数组置零
int main()
{
int A,B;
scanf("%d %d",&A,&B);
int h[B+1];
for(int i=A;i<=B;i++)
{
clear_zero(n2,10001);
h[i]=ishappy(1,i);
}
int flag=0;
for(int i=A;i<=B;i++)
{
if(h[i]&&n1[i]==0)
{
if(isprime(i)) printf("%d %d\n",i,h[i]*2);
else printf("%d %d\n",i,h[i]);
flag=1;
}
}
if(flag==0) printf("SAD");
return 0;
}
总结、
这几天看了看c++,前几道题就用c++写了,之后的题还是习惯于c语言,就用c写了。
也看了看大佬写的c++的版本,有很多的很方便函数,算是能明白为啥考试的时候学过c++的同学总是能写的这么快了。
这几天有点懈怠,得加紧学习(内卷)了。
最后说一句,qsort真好用!