天梯赛决赛题目

题的目标很简单,就是求两个正整数AB的和,其中AB都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式:

输入在一行给出AB,其间以空格分开。问题是AB不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是AB的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:

如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?

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

int check(char p[])
{
	int i = 1;
	if(!(p[0] >= '0' && p[0] <='9' || p[0] == '+'))
		return 0;
	while(p[i] != 0)
	{
		if(!(p[i]>='0' && p[i] <= '9'))
			return 0;
		i++;
	}
	return 1;
}

int main()
{
	char a[6],b[6];
	int flagA,flagB,A,B,i;
	for(i=0;i<5;i++)
	{
		a[i] = getchar();
		if(a[i] == ' ')
		{
			break;
		}
	}
	a[i] = 0;
	for(i=0;i<5;i++)
	{
		b[i] = getchar();
		if(b[i] == '\n')
		{
			break;
		}
	}
	b[i] = 0;
	flagA = check(a);
	flagB = check(b);
	if(flagA)
	{
		A = atoi(a);
		flagA = A >= 1 && A <= 1000;
	}
	if(flagB)
	{
		B = atoi(b);
		flagB = B >= 1 && B <= 1000;
	}
	if(flagA && flagB)
	{
		printf("%d + %d = %d\n",A,B,A+B);
	}
	if(flagA == 1 && flagB == 0)
	{
		printf("%d + ? = ?\n",A);
	}
	if(flagA == 0 && flagB == 1)
	{
		printf("? + %d = ?\n",B);
	}
	if(flagA == 0 && flagB ==0)
	{
		printf("? + ? = ?\n");
	}
	return 0;
}

判断素数的问题:
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
	bool isPrimeNum(long a);
	long n,a;
	scanf("%ld",&n);
	while(n--){
		scanf("%ld",&a);
		if(isPrimeNum(a)){
			printf("Yes\n");
		}else{
			printf("No\n");
		}
	}
	
	
	return 0;
} 
bool isPrimeNum(long a){
	if(a==0||a==1){
		return false;
	}
	if(a==2){
		return true;
	}
	for(int i=2 ;i<=sqrt(a) ;i++){
		if(a%i==0){
			return false;
		}
	}
	return true;
}

下面是新浪微博上曾经很火的一张图:

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应arr[2]=1index[1]=0 对应arr[0]=8index[2]=3 对应arr[3]=0,以此类推…… 很容易得到电话号码是18013820100

本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。

输入格式:

输入在一行中给出一个由11位数字组成的手机号码。

输出格式:

为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。

输入样例:

18013820100

输出样例:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};
#include <iostream>
#include <vector>
using namespace std ;
int main ( ) {
     string s ;
     cin >> s ;
     int a [ 10 ] = { 0 } ;
     for ( int i = 0 ; i < 11 ; i ++ ) {
         a [ s [ i ] - '0' ] ++ ;
     }
     vector < int > arr ;
     for ( int i = 9 ; i >= 0 ; i -- ) {
         if ( a [ i ] != 0 ) {
             arr . push_back ( i ) ;
         }
     }
     vector < int > index ;
     for ( int i = 0 ; i < 11 ; i ++ ) {
         for ( int j = 0 ; j < arr . size ( ) ; j ++ ) {
             if ( ( s [ i ] - '0' ) == arr [ j ] ) {
                 index . push_back ( j ) ;
             }
         }
     }
     cout << "int[] arr = new int[]{" << arr [ 0 ] ;
     for ( int i = 1 ; i < arr . size ( ) ; i ++ ) {
         cout << "," << arr [ i ] ;
     }
     cout << "};" << endl << "int[] index = new int[]{" << index [ 0 ] ;
     for ( int i = 1 ; i < index . size ( ) ; i ++ ) {
         cout << "," << index [ i ] ;
     }
     cout << "};" ;
     return 0 ;
}

战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。

输入格式:

输入在第一行给出两个整数N(0 <<<N≤\le 500)和M≤\le 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市信息之后给出被攻占的信息,即一个正整数K和随后的K个被攻占的城市的编号。

注意:输入保证给出的被攻占的城市编号都是合法的且无重复,但并不保证给出的通路没有重复。

输出格式:

对每个被攻占的城市,如果它会改变整个国家的连通性,则输出Red Alert: City k is lost!,其中k是该城市的编号;否则只输出City k is lost.即可。如果该国失去了最后一个城市,则增加一行输出Game Over.

输入样例:

5 4
0 1
1 3
3 0
0 4
5
1 2 0 4 3

输出样例:

City 1 is lost.
City 2 is lost.
Red Alert: City 0 is lost!
City 4 is lost.
City 3 is lost.
Game Over.
一直超时,还找不到解决办法
#include <bits/stdc++.h>
#include <vector>
using namespace std;
int visit[510];
int f[510];
struct road
{
    int x,y;
};
struct road p[5100];
int find1(int x)
{
    if(f[x]!=x)
    {
        f[x]=find1(f[x]);
        return f[x];
    }
    else return x;

}
void merg(int x,int y)
{
    int t1=find1(x);
    int t2=find1(y);
    if(t1!=t2)
    {
        f[t2]=t1;
    }
    return ;
}
int main()
{
    int n,m,i,j,x,y,t,c,count1,count2,r;
    scanf("%d %d",&n,&m);
    memset(visit,0,sizeof(visit));
    for(i=0;i<n;i++)
    {
        f[i]=i;
    }
    for(i=0;i<m;i++)
    {
     scanf("%d %d",&p[i].x,&p[i].y);
     merg(p[i].x,p[i].y);
    }
    count1=0;
    for(i=0;i<n;i++)
    {
     if(f[i]==i){
        count1++;
    }
    }
    scanf("%d",&t);
    for(r=0;r<t;i++)
    {
        for(i=0;i<n;i++)
    {
        f[i]=i;
    }
     scanf("%d",&c);
     visit[c]=1;
     for(j=0;j<m;j++)
     {
       if(visit[p[j].x]||visit[p[j].y])
       {
           continue;
       }
       else{
        merg(p[j].x,p[j].y);
       }
     }
     count2=0;
     for(i=0;i<n;i++)
     {
         if(f[i]==i)
         {
             count2++;
         }
     }
    if(count1==count2||count1+1==count2)
{
        printf("City %d is lost.\n",c);

}
   else
   {
    printf("Red Alert: City %d is lost!\n",c);
    }
    count1=count2;
    }
    int f=0;
    for(i=0;i<n;i++)
    {
        if(visit[i]==1)
        {
            f++;
        }
    }
    if(f==n)
    {
        printf("Game Over.\n");
    }
    return 0;
}
一帮一
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n,m,k,i,j,sum=0,a;
    cin>>n>>k>>m;
    a=m;
    int cj[n+2][k+2];
    double xs[n+2];
    for(i=0;i<n;i++)
    {
        sum=0;
        for(j=0;j<k;j++)
        {
            cin>>cj[i][j];
        }
        sort(cj[i],cj[i]+k);
        for(j=1;j<k-1;j++)
        {
         sum+=cj[i][j];

        }
        xs[i]=(double)sum/(k-2);
    }
    sort(xs,xs+n);
    while(a>0)
    {
     if(a==m)
     {

    printf("%.3f",xs[n-a]);
     }
     else
     {
         printf(" %.3f",xs[n-a]);
     }
     a--;
    }
    return 0;
}
互评成绩

#include <bits/stdc++.h>

using namespace std;
struct Person
{
    int sex;
    char name[10];
    bool visit=true;;
}p[50];
int main()
{
    int a,i,b,j,c=0,n;
    cin>>n;
    for(i=0;i<n;i++)
    {
    cin>>p[i].sex;
    cin>>p[i].name;
    }
    for(i=0;i<n;i++)
    {
        for(j=n-1;j>=0;j--)
        {
           if(p[i].sex!=p[j].sex&&p[i].visit&&p[j].visit)
           {
               p[i].visit=false;
                p[j].visit=false;
                printf("%s %s\n",p[i].name,p[j].name);
                c++;
                break;
           }
           if(c==n/2)
           {
               break;
           }
        }
    }
    return 0;
}
#include<cstdio>
#include<cmath>
using namespace std;
int n,a,b,c;

int main(){
	scanf("%d",&n);
	while(n--){
		scanf("%d%d",&a,&b);
		c = (a-100)*1.8;//标准体重 
		
		if(abs(b-c)<(c*0.1)){
			printf("You are wan mei!\n");
		}
		if((abs(b-c)>=(c*0.1))&&b<c){
			printf("You are tai shou le!\n");
		}
		if((abs(b-c)>=(c*0.1))&&b>c){
			printf("You are tai pang le!\n");
		}
	}	
	
	return 0;
}

火车站的列车调度铁轨的结构如下图所示。

两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?

输入格式:

输入第一行给出一个整数N (2 ≤\le N ≤105\le 10^5105),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。

输出格式:

在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。

即可转化为求用二分法最长上升子序列的问题
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
int n,a,b,c;

int main(){
	int n;
	cin>>n;
	int a[n+2];
	int b[n+2];
	int len=0;
	for(int i=0;i<n;i++)
    {
        cin>>a[i];
        if(a[i]>b[len-1]||len==0)
        {
            b[len++]=a[i];
        }
        else
        {
            int l=0,r=len-1,mid;
            while(l<=r)
            {
                mid=(l+r)/2;
                if(b[mid]<=a[i])
                {
                    l=mid+1;
                }
                else
                {
                    r=mid-1;
                }

            }
            b[l]=min(a[i],b[l]);
        }
    }

    cout<<len;
	return 0;
}

#include<bits/stdc++.h>
#include<cmath>
using namespace std;
int n,a,b,c;

int main(){
	string s;
	int n;
	char a;
	cin>>n>>a;
	scanf("\n");
	getline(cin,s);
	int l=s.length();
	if(l<n)
    {
        for(int i=0;i<n-l;i++)
        {
            cout<<a;
        }
        cout<<s;
    }
    else
    {
        int j=0;
      for(int i=l-n;i<=l-1;i++)
        {
            cout<<s[i];
        }

    }
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值