模拟算法基础C++

第1题     防空导弹     时限:1s 空间:256m

R 国正在遭受 M 国的导弹打击,于此同时 R 国刚刚研制出一款防空导弹, 拦截来袭导弹成功率达到 100%,即一枚防空导弹肯定能够拦截一枚来袭导弹。 M 国的来袭导弹已经到来,R 国要求立即生产这种防空导弹,来拦截来袭导 弹。 现在按照时间先后,依次给出 N 个值: 如果是-1,则表示一枚导弹来袭; 如果是 0~10 的正整数,则表示刚刚生产出 x 枚防空导弹,可以立即使用。

请你计算出还有多少枚来袭导弹,没有拦截。

输入格式

第一行一个正整数 N;

第二行 N 个正整数,表示按照时间先后顺序,给出的有一枚来袭导弹或生 产出的防空导弹数量;其值可能是-1 或 1~10 的整数

输出格式

输出一个正整数,表示未能拦截的来袭导弹数量。

输入/输出例子1

输入:

7  

1 -1 1 -1 -1 2 -1

输出:

1

输入/输出例子2

输入:

10  

-1 -1 3 -1 1 -1 -1 -1 -1 1

输出:

3

样例解释

【样例说明】: 

对于样例 1: 第一个时间就生产出了一枚防空导弹,可用来拦截第二个时间的-1; 第三个时间又生产出了一枚防空导弹,可用来拦截第四个时间的-1; 第五个时间的-1,则没有剩余的防空导弹拦截; 第六个时间生产出了 2 枚防空导弹,其中一枚可用来拦截第七个时间的- 1。还剩余一枚防空导弹; 总共有 1 枚来袭导弹没有拦截到

【时间限制、数据范围及描述】: 时间:1s 空间:64M 

对于 50%的数据:1≤N≤10000;没有特殊限制; 

对于 100%的数据:1≤N≤5×10^5;没有特殊限制;

#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],s,x;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		if(a[i]>=1)s+=a[i];
		else if(a[i]==(-1)){
			if(s>=1){
				s--;
			}
			else x++;
		}
	}
	cout<<x;
	return 0;
}

第2题     勇士     时限:1s 空间:256m

小明在学习信息学编程时,设计了一款游戏:初始时勇士的能力值为n,通往城堡的路上有m个挑战者,第i个挑战者的能力值为a[i]。勇士只能按照顺序依次迎战挑战者。当勇士的能力值大于等于挑战者时,视为勇士胜利,可以继续迎战下一位,否则视为失败,游戏直接结束。现在请你找出勇士在失败或全部通关后,他击败的挑战者里最强那位的能力值是多少。若一个都无法击败,则输出0。

输入格式

第一行,两个整数n和m。

第二行,m个整数,第i个整数为第i个挑战者的能力值a[i]。

输出格式

输出一个整数,为勇士在失败或全部通关后,他击败的挑战者里最强那位的能力值。

输入/输出例子1

输入:

100 4

98 77 123 56

输出:

98

输入/输出例子2

输入:

130 4

98 77 123 56

输出:

123

样例解释

【样例说明】

样例1中,勇士的能力值是100,共有4位挑战者,能力值分别为98、77、123、56。勇士能够击败第1、2位挑战者,但无法击败第3位,因此在他击败的挑战者里,最强那位的能力值是98。

样例2中,勇士的能力值是130,共有4位挑战者,能力值分别为98、77、123、56。勇士能够击败所有的挑战者,因此在他击败的挑战者里,最强那位的能力值是123。

【数据范围】

对于100%的数据,1≤n,m,a[i]≤10000。

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[10005],maxx=0; 
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%lld",&a[i]);
		if(n>=a[i]){
			if(a[i]>maxx)maxx=a[i];
		}
		else break;
	}
	printf("%lld",maxx);
    return 0;
}

第3题     软件版本     时限:1s 空间:256m

相信大家一定有过在网上下载软件而碰到多个不同版本的情况。一般来说,软件的版本号由三个部分组成,主版本号(Major Version Number),子版本号(Minor Version Number)和修订号(Revision_Number)。当软件进行了重大的修改时,主版本号加一;当软件在原有基础上增加部分功能时,主版本号不变,子版本号加一;当软件仅仅修正了部分bug时,主版本号和子版本号都不变,修正号加一。
在我们比较软件的两个版本的新旧时,都是先比较主版本号,当主版本号相同时再比较子版本号,前两者都相同的情况下再比较修正号。版本号越大的软件越新。
现在,小明在下载软件的时候碰到了两个版本,请你告诉他哪个版本更新一些。

输入格式

输入的第一行有一个整数T,代表有T组测试。

接下来有T组测试。
每组测试分两行,第一行有三个整数代表第一个软件版本的主版本号,子版本号和修订号。第二行也有三个整数代表第二个软件版本的主版本号,子版本号和修订号。
数据中出现的整数都在[0,1000]范围之内。

输出格式

对于每组测试,如果第一个软件的版本新点,请输出First,如果第二个软件的版本新点,请输出Second,否则输出Same。

输入/输出例子1

输入:

3

1 1 0

1 1 1

1 1 1

1 1 0

1 1 1

1 1 1

输出:

Second

First

Same

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;  
    scanf("%d",&n);  
    while(n--){  
        int a[2][3];  
        for(int i=0;i<2;i++)  
            for(int j=0;j<3;j++)  
                scanf("%d",&a[i][j]);  
        if(a[0][0]>a[1][0]){  
            printf("First");
        }  
        else if(a[0][0]<a[1][0]){  
            printf("Second");
        }  
        else{  
            if(a[0][1]>a[1][1]){  
                printf("First");
            }  
            else if(a[0][1]<a[1][1]){  
                printf("Second");  
            }  
            else{  
                if(a[0][2]>a[1][2]){  
                    printf("First");
                }  
                else if(a[0][2]<a[1][2]){  
                    printf("Second");
                }  
                else  
                    printf("Same");  
            }  
        }  
        if(n!=0)  
            printf("\n");  
    }
	return 0;
}

第4题     竞技游戏     时限:1s 空间:256m

小灰灰小东东在玩一种竞技游戏。在游戏中,小灰灰小东东n个正整数组成的序列以及m条操作指令,需要小东东按照指令来对n个整数进行操作。其中每条指令都包括二个整数(a, b),意义如下: 

如果a大于0,表示将序列中第b个数乘于2 

如果a小于0,表示将序列中第b个数加上2 

如果a等于0,则忽略此条指令。 

游戏结束后,小东东需要求出序列中的最大值。现在小东东求助于你,希望你能用计算机编程求出他需要的答案。题目保证计算结果在int的表示范围内。

输入格式

输入数据第一行为一整数T,表示有T组数据。每组输入数据第一行有二个整数n, m, (1 <= n <= 100), (1 <= m <= 100), 第二行有n个整数(1 ~100),表示初始序列,编号从1...n。接着是m行表示m条指令,每行共有2个用空格隔开的整数a b,(-50<= a <= 50), (1 <= b <= n)

输出格式

对于每组数据,输出一个整数占一行,表示操作后的序列中的最大整数。

输入/输出例子1

输入:

2

2 2

1 2

1 1

-1 2

3 4

1 5 6

1 1

1 1

0 1

-1 1

输出:

4

6

#include<bits/stdc++.h>
using namespace std;
int s[100005];
void f(int a,int b,int *s){
    if(a>0)s[b]*=2;
    else if(a<0)s[b]+=2;
    else if(a==0)s[1]+=0;
}
int t,m,n,a,b;
int main(){
    scanf("%d",&t);
    while(t--){
        memset(s,0,sizeof(s));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
        	scanf("%d",&s[i]);
        }
        for(int i=0;i<m;i++){
            scanf("%d%d",&a,&b);
            f(a,b,s);
        }
        sort(s,s+n+1);
        printf("%d\n",s[n]);
    }
    return 0;
}

第5题     交通灯     时限:1s 空间:256m

城市道路的交叉路口通常设置有绿灯、黄灯和红灯三种状态的交通灯,它们的作用是:当绿灯亮时,表示车辆可通行;当黄灯亮时,提醒正在交叉路口中行驶的车辆赶快离开;当红灯亮,车辆要在停车线后停驶。

交通灯的状态经过红灯、黄灯和绿灯为一个周期,假设在每一周期中绿灯时间为30秒,红灯时间为20秒,路口上车辆的疏通速度是0.6/秒。(黄灯时间一般很短这里忽略不计)

交警队长需要你帮忙计算出第n个周期后滞留下来的车辆数量,以便采取更有效的措施改进交通状况。

输入格式

共有n+2行:

1行为要计算滞留车辆数的周期n

2行为第1周期开始时由前一周期滞留下来的车辆数;

3n+2行分别为第1n周期的车辆到达数。每行有两个数,第1个为红灯时的车辆到达数,第2个为的绿灯时的车辆到达数。

以上所有输入数据均为[0,100]。

输出格式

只有一个数:经过第n周期后,滞留下来的车辆数。

输入/输出例子1

输入:

1

2

3 5

输出:

0

输入/输出例子2

输入:

2

5

8 12

6 9

输出:

4

#include<bits/stdc++.h>
using namespace std;
int n,s,a[1000],b[1000],x;
int main(){
    cin>>n>>s;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>b[i];
        s=s+a[i]+b[i];
        s=s-18;
        if(s<0){
           s=0;
        }
    } 
    cout<<s;   
    return 0;
}

第6题     电梯升降     时限:1s 空间:256m

某城市最高的建筑只有一部电梯。一份电梯升降任务表由N个正整数组成,这些数字表示电梯按照给定的顺序停留的楼层号。
电梯升一层花费6秒钟,降一层花费4秒钟,并且每次停留花费5秒钟。
对于每一份任务表,你要计算出完成全部升降任务所花费的总时间。一开始,电梯在第0层,并且最终完成任务时电梯不必一定返回到0层。

输入格式

有多组测试样例。每组测试样例包含一个正整数N,接下来是N个正整数。
在输入中,所有的数字都小于100。当N=0时,表示输入结束。

输出格式

对于每一组测试样例,在一行中输出总时间。

输入/输出例子1

输入:

1 2

3 2 3 1

0

输出:

17

41

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
    int a[1000];
    while(cin>>n){
        if(n==0)break;
        int t=0;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        t=(a[0])*6+5;
        for(int i=1;i<n;i++){
            if(a[i]>a[i-1])t+=((a[i]-a[i-1])*6)+5;
            else t+=((a[i-1]-a[i])*4)+5;
        }
        cout<<t<<endl;
    }
	return 0;
}

第7题     石头剪子布     时限:1s 空间:256m

石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。

游戏规则:石头打剪刀,布包石头,剪刀剪布。

现在,需要你写一个程序来判断石头剪子布游戏的结果。

输入格式

第一行是一个整数N,表示一共进行了N次游戏。1≤N≤100。

接下来N行的每一行包括两个字符串,表示游戏参与者Player1,Player2的选择(石头、剪子或者是布):S1 S2,字符串之间以空格隔开S1,S2只可能取值在{"Rock", "Scissors", "Paper"}(大小写敏感)中。

输出格式

输出包括N行,每一行对应一个胜利者(Player1或者Player2),或者游戏出现平局,则输出Tie。

输入/输出例子1

输入:

3

Rock Scissors

Paper Paper

Rock Paper

输出:

Player1

Tie

Player2

#include<bits/stdc++.h>
using namespace std;
char a[101],b[101];
int n;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a>>b;
		if(a[0]=='R'&&b[0]=='S'||a[0]=='S'&&b[0]=='P'||a[0]=='P'&&b[0]=='R')cout<<"Player1"<<endl;
		else if(a[0]==b[0])cout<<"Tie"<<endl;
        else cout<<"Player2"<<endl;
	}
	return 0;
}
 
 
 

第8题     分糖果     时限:1s 空间:256m

n颗糖果,有a五年级同学b六年级同学

现在要分配糖果。
(1)每个学生至少要分到
1个糖果,至多分到100000个糖果。

(2)每个五年级同学分到的糖果数量必须相同。每个六年级同学分到的糖果数量也必须相同。

(3)每个五年级同学分到的糖果数量必须比每个六年级同学分到的糖果数量要多。

如果按照上述的分配规则,无法分配,那么输出-1

如果可以分配,那么输出剩下最少的糖果数量(即尽可能的把糖果分配出去,使得剩下的糖果最少)。

输入格式

三个整数:n,a,b  
1<=n<=10^121<=a<=10^12,  1<=b<=10^12。

输出格式

一个整数。

输入/输出例子1

输入:

9  3  2

输出:

1

输入/输出例子2

输入:

5  3  2

输出:

-1

#include<bits/stdc++.h>
using namespace std;
long long n,a,b;
int main(){
    cin>>n>>a>>b;
    if(n<a*2+b){
        cout<<-1;
        return 0;
    }
    long long minn=n,s=n;
    for(long long i=2;i<=100000;i++){
        if(i*a+b<=n){
            s=n-i*a;
            if((i-1)*b>s)s%=b;
            else s-=(i-1)*b;
            minn=min(minn,s);
        }
        else {
            break;
        }
    }
    cout<<minn;
    return 0;
}

第9题     鼠鼠的薪水     时限:1s 空间:256m

浪浪国的鼠鼠阿胡是一只新上任的公务鼠,它的职责是看管粮仓。

鼠鼠它每天都会吃掉根玉米,每个星期一会拿到根玉米作为薪水。但是贪心的鼠鼠怎么会就此满足呢,所以每个星期二它还会偷偷往家拿根玉米。

虽然鼠鼠非常精明,但是纸是包不住火的,终究还是东窗事发了。鼠鼠被抄家时,从它的被窝里找出了根玉米,已知它上任前家里一共有 10 根玉米,请问从星期三上任到被捕入狱,它一共当了几天公务鼠呢?

请注意:鼠鼠被抓的当天,还没有来得及享受美味的玉米,被抓的当天不能算在它作为公务鼠的统计天数内。

输入格式

输入一个整数 n ,表示剩下的玉米数量。

输出格式

输出一个整数,表示当公务鼠的天数。

输入/输出例子1

输入:

17

输出:

7

输入/输出例子2

输入:

23

输出:

15

样例解释

【样例 1解释】

原先有 10 根玉米,周三作为第一天。

第一天吃完还剩 9根。

第二天吃完还剩 8 根。

依次类推,到第五天吃完,还剩根。

第六天因为是周一,发了根,吃了根,所以还剩11 根。

第七天是周二,偷了根,吃了根,所以还剩17 根。

第八天被抓了,所以实际只当了天的公务鼠。

【数据范围】

5≤n≤5000

#include<bits/stdc++.h>
using namespace std;
long long n,s=10,ans=0;
int main(){
	scanf("%lld",&n);
	for(long long i=3;;i++){
		if(i==8)i=1;
		if(i>=1&&i<3)s+=6,ans++;
		if(i>=3&&i<=7)s--,ans++;
		if(s==n){
			cout<<ans;
			return 0;
		}
	}
    return 0;
}

第10题     奇怪的球     时限:1s 空间:256m

文景收到了N(1≤N≤4×10^5)个奇怪的球,球摆成一列,每个球的表面都写着一个数字,第i个球的表面数字是a[i](2≤a[i]≤4×10^5)。

文景准备将所有的球从1到N依次放入桶中。桶是圆柱形的,底面是封死的,只能从圆柱形顶端放入。桶比较窄,桶中的球只能全部竖着叠放。

文景在放球的过程中,奇怪的事情发生了,如果桶中有连续x个值为x的球,这些球将会消失。

请你帮助文景计算出,从1到N依次放入每个球后,桶中的球有多少个?

输入格式

第一行一个正整数N;

第二行N个正整数,从1到N依次表示每个球表面的数字。

【时间限制、数据范围及描述】:

时间:1s 空间:256M

对于30%的数据:1≤N≤10^4;2≤a[i]≤100;

对于100%的数据:1≤N≤4×10^5;2≤a[i]≤4×10^5;

输出格式

输出N行,每行一个整数,第i行表示放完第i个球后桶中球的个数。

输入/输出例子1

输入:

5

3 2 3 2 2

输出:

1

2

3

4

3

输入/输出例子2

输入:

10

2 3 2 3 3 3 2 3 3 2

输出:

1

2

3

4

5

3

2

3

1

0

样例解释

考虑样例1:

1个球放入后,桶中球从下至上依次为:3

2个球放入后,桶中球从下至上依次为:3 2

3个球放入后,桶中球从下至上依次为:3 2 3

4个球放入后,桶中球从下至上依次为:3 2 3 2

5个球放入后,桶中球从下至上依次为:3 2 3

#include<bits/stdc++.h>
using namespace std;
int n,a[10000005],s[10000005];
int main(){
    scanf("%d",&n);
    int x=1;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[x]);
        if(a[x]==a[x-1])s[x]=s[x-1]+1;
        else s[x]=1;
        if(s[x]==a[x])x=x-s[x];
        printf("%d\n",x);
        x++;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值