蓝桥杯总结

题目描述

长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。

每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。

当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

输入

第一行输入一个整数n  (1  <   n  <   50),  表示蚂蚁的总数。 

接着的一行是n个用空格分开的整数  Xi  (-100  <   Xi  <   100),  Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数  据代表的蚂蚁感冒了。

输出

要求输出1个整数,表示最后感冒蚂蚁的数目。 

样例输入

5
-10 8 -20 12 25

样例输出

3

下面这个只能过c语言网

#include<bits/stdc++.h>
using namespace std;
int main(){       
int n,i,a[50],k=1;
scanf("%d",&n);
for(i=0;i<n;i++){
	scanf("%d",&a[i]);
}
if(a[0]<0){
	for(i=0;i<n;i++){
		if(a[i]>0&&fabs(a[i])<fabs(a[0]))k++;
		if(k!=0){if(a[i]<0&&fabs(a[i])>fabs(a[0]))k++;
	}
}}
if(a[0]>0){
	for(i=0;i<n;i++){
		if(a[i]<0&&fabs(a[i])>a[0])k++;
					if(k!=0){
						if(a[i]>0&&fabs(a[i])<a[0])k++;
					}
	}
	
}
printf("%d",k);	
	return 0;
}

 这题很简单当时没加if(k!=0)结果没做出来

下面正确代码

import java.io.*;
import java.util.Scanner;

public class Main {
    static Scanner sc=new Scanner(System.in);
    static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st=new StreamTokenizer(br);
static PrintWriter pw=new PrintWriter(new BufferedOutputStream(System.out));
public static int nextInt()throws Exception{
    st.nextToken();
    return (int)st.nval;
}
public static double nextDouble() throws Exception{
    st.nextToken();
    return st.nval;
}
    public static String next() throws Exception{
        st.nextToken();
        return st.sval;
    }
public static String nextLine() throws Exception{
    return br.readLine();
}
  static int N;
static int[] a;

    public static void main(String[] args) throws Exception{
       //N= st.nextToken();
       N=nextInt();
       a=new int[N];
       a[0]=nextInt();
       int n=a[0];
       int right=0;
       int left=0;
       for(int i=1;i<N;i++){
           a[i]=nextInt();
 if(Math.abs(a[i])>Math.abs(n)&&a[i]<0)right++;
 else if(Math.abs(a[i])<Math.abs(n)&&a[i]>0)left++;

       }
if(n<0){
    if(left==0) System.out.println(left+1);
    else System.out.println(left+1+right);
}else{
    if(right==0) System.out.println(right+1);
    else System.out.println(left+1+right);

}







    }








}

题目描述

某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。

输入

要求程序首先输入一个整数N(N< 100)表示后面数据行数。 
接着读入N行数据。 
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。 
每个整数代表一个ID号。 

输出

要求程序输出1行,含两个整数m  n,用空格分隔。 
其中,m表示断号ID,n表示重号ID 

样例输入

2
5 6 8 11 9
10 12 9

样例输出

7 9

这题我是最无语的当时觉得有可能包括负数耍了个小聪明结果没写i>=1结果显示运行错误,我还以为是哪错了没想到是这个细节让我与蓝桥杯失之交臂,但主要是平时太不认真了,又懒,也不重视,刷题习惯也没养成,一切自有因果吧,算是一个教训了,fff

下面是当时的代码

#include<bits/stdc++.h>
using namespace std;
int main(){       
int n,a,cnt=0,c,d;
scanf("%d",&n);
int b[100010]={0};

while((scanf("%d",&a))!=EOF){
	b[a]++;
	cnt++;
}
for(int i=100000;;i--){
	if((b[i]==0)&&(b[i+1]!=0)&&(b[i-1]!=0))c=i;
	if(b[i]>1)d=i;
}
printf("%d %d",c,d);
	return 0;
}

 正确的代码只差一个i>=1

#include<bits/stdc++.h>
using namespace std;
int main(){       
int n,a,cnt=0,c,d;
scanf("%d",&n);
int b[100010]={0};

while((scanf("%d",&a))!=EOF){
	b[a]++;
	cnt++;
}
for(int i=100000;i>=1;i--){
	if((b[i]==0)&&(b[i+1]!=0)&&(b[i-1]!=0))c=i;
	if(b[i]>1)d=i;
}
printf("%d %d",c,d);
	return 0;
}

题目描述

话说这个世界上有各种各样的兔子和乌龟,但是  研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔  子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以  上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。

然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1  米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找  到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。

输入

输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2< =100;t< =300;s< =10;l< =10000且为v1,v2的公倍数) 

输出

输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。 

第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。 

样例输入

10 5 5 2 20

样例输出

D
4

这题也很简单,当时一看题目太长就以为很难没想到这么简单就正常写无需任何算法

#include <stdio.h>
int main ()
{
	int v1,v2,t,s,l,i=0;
	int ans1=0,ans2=0;
	scanf("%d %d %d %d %d",&v1,&v2,&t,&s,&l);
	while(ans1<l && ans2<l)
	{
		ans1+=v1;
		ans2+=v2;
		i++;
		if(ans1==l || ans2==l )
			break;
		if(ans1-ans2>=t)
			ans1-=s*v1;
	}
	if(ans1>ans2)
		printf("R\n");
	else if(ans1<ans2)
		printf("T\n");
	else
		printf("D\n");
	
	printf("%d",i);
	return 0;
	
 } 

题目描述

安全局搜索到了一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序。身份证号码为18位的数字组成,出生日期为第7到第14位

 

输入

第一行一个整数n,表示有n个身份证号码 

余下的n行,每行一个身份证号码。 

数据规模和约定
n< =100000
 

输出

按出生日期从大到小排序后的身份证号,每行一条 

样例输入

5 
466272307503271156 
215856472207097978 
234804580401078365 
404475727700034980 
710351408803093165 

样例输出

404475727700034980
234804580401078365
215856472207097978
710351408803093165
466272307503271156

这题就有点遗憾了当时一直在看这题忽略了其它题,当时就遇到过sort 的题了一直没去学,因果关系吧,你现在的所做所想可能就决定了你的发展,希望自己以后可以坚定一定;用sort轻松解决、

#include<bits/stdc++.h>
using namespace std;
#define ll long long
bool kkk(ll a,ll b){
	ll c=a/10000%100000000;
	ll d=b/10000%100000000;
	if(c!=d)return c>d;
else return a>b;
}
int main(){
	ll a[100010];
	int n,i;
scanf("%d",&n);
for(i=0;i<n;i++){
	scanf("%lld",&a[i]);
}	
	sort(a,a+n,kkk);
	for(i=0;i<n;i++){
	printf("%lld\n",a[i]);
	}
	
	return 0;
}

 注意如果用1e+数字是小数用的话要强制转换为int

题目描述

栋栋正在和同学们玩一个数字游戏。

游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈。栋栋首先说出数字1。接下来,坐在栋栋左手边的同学要说下一个数字2。再下面的一个同学要从上一个同学说的数字往下数两个数说出来,也就是说4。下一个同学要往下数三个数,说7。依次类推。

为了使数字不至于太大,栋栋和同学们约定,当在心中数到  k-1  时,下一个数字从0开始数。例如,当k=13时,栋栋和同学们报出的前几个数依次为:
1,  2,  4,  7,  11,  3,  9,  3,  11,  7。

游戏进行了一会儿,栋栋想知道,到目前为止,他所有说出的数字的总和是多少。

样例说明
栋栋说出的数依次为1,  7,  9,和为17。

 

输入

输入的第一行包含三个整数  n,k,T,其中  n  和  k  的意义如上面所述,T  表示到目前为止栋栋一共说出的数字个数。 

数据规模和约定
1  <   n,k,T  <   1,000,000;

输出

输出一行,包含一个整数,表示栋栋说出所有数的和。 

样例输入

3 13 3

样例输出

17

 这题不过就是简单的等差数列,主要是太不坚定太不相信自己了

#include <stdio.h>
int main()
{
    int n, k, T;
    long long sum = 1, t=1, a=1;
    scanf("%d%d%d", &n, &k, &T);
    for(int i = 1; i < T; ++i)
    {
        t = (((a+a+n-1)*n/2)+t)%k;
        sum += t;
        a += n;
    }
    printf("%lld\n", sum);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怀化第一深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值