【思特奇杯 云上蓝桥-算法集训营】

一.门牌制作

1.题目描述
在这里插入图片描述
2.参考代码

#include<cstdio>
int main(){
	int count=0;
	int m;
	for(int i=1;i<=2020;i++){
		m=i;
		while(m){
			if(m%10==2){
				count++;
			}
			m/=10;
		}
	}
	printf("%d",count);
	return 0;
}

3.运行结果
在这里插入图片描述

二.既约分数

1.题目描述
在这里插入图片描述
2.参考代码

#include<cstdio>
int gcd(int a,int b){  //也适合a<b这种情况
	if(a%b==0){
		return b;
	}
	else{
		return gcd(b,a%b);
	}
}
int main(){
	int i,j,ans;
	for(i=1;i<=2020;i++){
		for(j=1;j<=2020;j++){
			if(gcd(i,j)==1){
				ans++;
			}			
		}
	}
	printf("%d",ans);
	return 0;
}

3.运行结果
在这里插入图片描述

三.蛇形填空

1.题目描述在这里插入图片描述
2.参考代码

#include<cstdio>
int main(){
	int i,ans=1;
	for(i=1;i<=19;i++){
		ans+=4*i;
	}
	printf("%d",ans);
	return 0;
}

3.运行结果
在这里插入图片描述

四.跑步训练

1.题目描述
在这里插入图片描述
2.参考代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  int sumkm=0;
  int week=5;
  int i,j,k;
  for(i=0;i<21;i++)
  {
    month[1]=28;
    if(i==0 || i==4 || i==8 || i==12 || i==16 || i==20) month[1]=29;
    for(j=0;j<12;j++)
    {
      for(k=0;k<month[j];k++)
      {
        sumkm++;
        week++;
        if(week==8) week=1;
        if(week == 1 || k==0) sumkm++;
        if(i==20 && j==9 && k==0)
          goto end;
      }
    }
  }
  end:
  printf("%d",sumkm);
  return 0;
}

五.七段码

1.题目描述
在这里插入图片描述
在这里插入图片描述
2.参考代码

#include <bits/stdc++.h>
using namespace std;
string str = "0000000";
string vis;
int ans = 0;
//如何检查排列是否合法?
int umap[7][7];
void initmap()
{
    memset(umap, 0, sizeof(umap));
    umap[0][1] = umap[0][5] = 1;
    umap[1][0] = umap[1][2] = umap[1][6] = 1;
    umap[2][1] = umap[2][3] = umap[2][6] = 1;
    umap[3][2] = umap[3][4] = 1;
    umap[4][3] = umap[4][5] = umap[4][6] = 1;
    umap[5][0] = umap[5][4] = umap[5][6] = 1;
    umap[6][1] = umap[6][2] = umap[6][4] = umap[6][5] = 1;
}
void dfs(int curr)
{
    vis[curr] = '0';//标记访问过了
    for (int j = 0; j < 7; ++j)
    {
        if (umap[curr][j] == 1 && vis[j] == '1')
            dfs(j);
    }
}
bool check()
{
    int cnt = 0;
    for (int i = 0; i < 7;++i)
    {
        if(vis[i]=='1')
        {
            dfs(i);
            ++cnt;
        }
    }
    return cnt == 1;
}
int main()
{
    initmap();
    for (int i = 0; i < 7; ++i)
    {
        sort(str.begin(), str.end());
        str[6 - i] = '1';
        do
        {
            vis = str;
            if(check())
                ++ans;

        } while (next_permutation(str.begin(), str.end()));
    }
    cout << ans << endl;
    return 0;
}

六.成绩统计

1.题目描述
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。

请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。

输入描述
输入的第一行包含一个整数 n\ (1 \leq n \leq 10^4)n (1≤n≤10
4),表示考试人数。

接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出描述
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。

输入输出样例
示例
输入

7
80
92
56
74
88
100
0

输出

71%
43%

2.参考代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  // 请在此输入您的代码
  int n;
  int i;
  int youxiu=0,jige=0;
  scanf("%d",&n);
  for(i=0;i<n;i++){
    int a;
    scanf("%d",&a);
    if(a>=85){
      youxiu++;
    }
    if(a>=60){
      jige++;
    }
  }
  printf("%.0f%%\n",(jige*100.0)/n);
  printf("%.0f%%",(youxiu*100.0)/n);
  return 0;
}

七.回文日期

1.题目描述
在这里插入图片描述在这里插入图片描述
2.参考代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int a,c,d;
  int b[8],i;
  scanf("%d",&a);
  c=a;
  d=a;
 
 for(;;c++)
  {a=c+1;
      for(i=0;a!=0;a=a/10)
    { b[i]=a%10; 
  i++;}

     if(b[0]==b[7]&&b[1]==b[6]&&b[2]==b[5]&&b[3]==b[4]&&b[5]!=0&&b[4]<=1&&b[6]<=2)
    {printf("%d\n",c+1);
  break;}}
   for(;;d++)
  {a=d+1;
      for(i=0;a!=0;a=a/10)
    { b[i]=a%10; 
  i++;}
       if(b[0]==b[7]&&b[0]==b[2]&&b[2]==b[5]&&b[1]==b[4]&&b[4]==b[3]&&b[3]==b[6]&&b[5]!=0&&b[4]<=1&&b[6]<=2)
    {printf("%d\n",d+1);
  break;}}
  // 请在此输入您的代码
  return 0;
}

八.子串分值和

1.题目描述
在这里插入图片描述
在这里插入图片描述
2.参考代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
 char s[10000];
 int a,b=0,c=0,d=0;
 scanf("%s",s);
 char temp;
 a=strlen(s);
 int i,q,j=0;
 for( i=0;i<a;i++)
 {    j=i;
    b=0; 
 while(j<a)
{      c=0; 
   for(int k=i;k<=j;k++)
    {  q=0; temp=s[k];
        for(int g=i;g<=j;g++)
        { 
          if(temp==s[g])
          q++;
        }
        if(q==1)
        c++;
            }
      b=b+c;
      j++;
 }
 d=b+d;
 }
printf("%d",d);
  return 0;
}

九.平面切分

1.题目描述
在这里插入图片描述
2.参考代码

#include <iostream>
using namespace std;
int main()
{
  int n, a[1005],b[1005],c[1005][1005]={0};;
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i]>>b[i];
    
    c[a[i]][b[i]]++;
  }
  for(int i=1;i<=n;i++)
  {
    if(c[a[i]][b[i]]>1)
    n=n-c[a[i]][b[i]]+1;
  }
  int num=2*n;
  cout<<num<<endl;



  // 请在此输入您的代码
  return 0;
}

十.子串排序

1.题目描述
在这里插入图片描述
在这里插入图片描述

2.参考代码

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  int i,m,t,j;
  int n=0;
  while((n*n-n)/2<100){ //求最坏情况下的字符串长度
     n=n+1;
  }
  m=(n*n-n)/2-100;//比起完全逆序,字符串可以比完全逆序少m次比较
  int arr[n];
  for(i=0;i<n;i++){
      arr[i]=97+n-i-1;//arr[]为完全逆序字符串
  }
  for(i=5;i>0;i--){
    if(arr[i]<arr[i-1]){
      t=arr[i];
      arr[i]=arr[i-1];
      arr[i-1]=t;
    }
  }
  for(i=0;i<n;i++){
    printf("%c",arr[i]);
  }
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值