C++综合基础(GOC常考类型:贪心、模拟、枚举、数论)答案

声明:这个文章适合新手,高手可以自己想一下。
第1题     纪念品分组     时限:1s 空间:256m

元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值不至于太高,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。

你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

输入格式

包含n+2:

1行包括一个整数w,为每组纪念品价格之和的上限, 第2行为一个整数n,表示购来的纪念品的总件数G

3-n+2行每行包含一个正整数Pi (5 <= Pi <= w)w表示所对应纪念品的价格。

输出格式

仅一行,包含一个整数, 为最少的分组数目

输入/输出例子1

输入:

100

9     

90     

20     

20     

30     

50     

60     

70     

80     

90

输出:

6

样例解释

50%的数据满足: 1 <=n <= 15

100%的数据满足: 1 <= n <= 30000, 80 <= W <= 200

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long w,n,a[30005],q,s,r;
int main()
{
    scanf("%d%d",&w,&n);
    r=n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+n+1);
    while(q<=r)
	{
        if((a[r]+a[q])<=w)
		{
            r--;
            q++;
        }
        else r--;
        s++;
    }
    printf("%d",s);
    return 0;
}
第2题     糖果      时限:1s 空间:256m

你有n个盒子,第i个盒子有a[i]颗糖果。你有n个朋友,你打算给每个朋友都送一盒糖果。

为了公平,每个朋友得到的糖果数量要一样多。于是你打算吃掉某些盒子里面的一部分糖果,以达到每个盒子剩下的糖果都一样多。

你至少需要吃掉多少颗糖果?

输入格式

第一行,一个整数t, 表示有t组测试数据,t<=100。

每组测试数据格式如下:

1行,一个整数n。 1<=n<=50。

2行,n个整数,第i个整数是a[i]。1<=a[i]<=10000000。

输出格式

t行,每行一个整数。

输入/输出例子1

输入:

5

5

1 2 3 4 5

6

1000 1000 5 1000 1000 1000

10

1 2 3 5 1 2 7 9 13 5

3

8 8 8

1

10000000

输出:

10

4975

38

0

0

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,a[55],s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int m,minn=999999999;
        cin>>m;
        for(int j=1;j<=m;j++)
        {
            cin>>a[j];
            if(a[j]<minn)minn=a[j];
            s=s+a[j];
        }
        cout<<s-m*minn<<endl;
        s=0;
        for(int j=1;j<=m;j++)
            a[j]=0;
    }
    return 0;
}
第3题     手工作品     时限:1s 空间:256m

 为迎接庆祝五一劳动节,吴老师准备组织信息学训练队的同学今天一起制作手工作品送给环卫工人。信息学训练n个同学,每位同学一天能够制作出不同数量的手工作品。现有m个手工作品要求今天一天制作,请问吴老师最少需要派几位同学来完成这次手工作品制作任务?如果安排所有的同学都参与制作也不能在一天内完成任务,请输出“NO”。

输入格式

第一行有两个整数,用空格隔开:第一个整数代表要制作的手工作品个数 m (m≤10000),第二个整数代表同学的数量 n(n≤100)。

第二行有 n 个整数,分别代表每位同学一天能够制作出来的手工作品数量(每位同学一天能够制作出来的手工作品数量≤100)。

输出格式

1天时间内制作所有手工作品需要的同学数量,或者输出NO

输入/输出例子1

输入:

10 5

1 3 2 4 2

输出:

4

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[105],s,s1;
int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=n;i>=1;i--)
    {
        s++,s1=s1+a[i];
        if(s1>=m)
        {
            cout<<s;
            return 0;
        }
    }
    cout<<"NO";
    return 0;
}
第4题     选数     时限:1s 空间:256m

n个数保存在数组a[1...n],从里面选出两个数,使得这两个数相加的和是21,问有多少种不同的选法。

输入格式

第一行,一个整数n。1<=n<=50。

第二行,n个整数,第i个整数是a[i]。1<=a[i]<=20。

输出格式

一个整数。

输入/输出例子1

输入:

2

1 20

输出:

1

输入/输出例子2

输入:

4

10 10 11 11

输出:

4

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,a[100],s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(a[i]+a[j]==21)
            {
                s++;
            }
        }
    }
    cout<<s;
    return 0;
}
第5题     车库      时限:5s 空间:256m

红太阳农场的车库里,停了很多自行车和三轮车,众所周知,一辆自行车有 2 个轮子,一辆三轮车有 个轮子。

车库管理员张师傅数了数,车库一共有 N 个轮子。请编程计算出,车库中,可能有多少辆自行车,多少辆三轮车?

输入格式

读入一个整数 N ,代表车库中车轮的总数;

输出格式

请按照自行车从少到多的顺序,输出自行车和三轮车可能的数量,每行输出一组可能的答案;

每行用空格隔开 2个整数,第 个整数代表自行车可能的数量,第 个整数代表三轮车可能的数量;

输入/输出例子1

输入:

16

输出:

2 4

5 2

8 0

输入/输出例子2

输入:

21

输出:

0 7

3 5

6 3

9 1

样例解释

车库共有 16 个轮子,那么如果有 辆自行车, 辆三轮车,总轮子数量=2×2+4×3=16,符合题意,同理 5辆自行车、 2 辆三轮车 或者 辆自行车、 辆三轮车,也都能计算出共有 16 个轮子;

数据范围

对于 100%的数据,2≤N≤1000

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n;
int main(){
    cin>>n;
    for(int i=0;i<=n/2;i++)
    {
        int s=n-i*2;
        if(s%3==0)
        {
            cout<<i<<" "<<s/3<<endl;
        }
    }
    return 0;
}
第6题     玩游戏     时限:1s 空间:256m

图片.png

输入格式

1.jpg

输出格式

2.jpg

输入/输出例子1

输入:

4
abcCAB
AbcaCB
abABCc
abABBc

输出:

YES
NO
NO
NO

样例解释

1.jpg

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,s1,s2,s3,t;
string a;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        s1=0,s2=0,s3=0,t=0;
        for(int j=0;j<a.size();j++)
        {
            if(a[j]=='a')s1++;
            else if(a[j]=='b')s2++;
            else if(a[j]=='c')s3++;
            else if(a[j]=='A')
            {
                if(s1==0)
                {
                    t=1;
                    break;
                }
                else s1--;
            }
            else if(a[j]=='B')
            {
                if(s2==0)
                {
                    t=1;
                    break;
                }
                else s2--;
            }
            else if(a[j]=='C')
            {
                if(s3==0)
                {
                    t=1;
                    break;
                }
                else s3--;
            }
        }
        if(t==0)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

第7题     防空导弹     时限: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 0

输出:

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;
long long n,a,s=0,z;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        if(a==-1)
        {
            if(s==0)z++;
            else s--;
        }
        if(a>0)s+=a;
    }
    cout<<z;
    return 0;
}
第8题     青蛙跳步     时限:1s 空间:256m

在一条数轴上,有一只青蛙,它所在的位置是整数点x,如果它的跳跃距离是d,并且向左跳,那么跳到的点是x-d;如果向右跳,就跳到x+d。青蛙总共要跳n次,第i次的跳跃距离是i,但是第i次到底是向左跳还是向右跳呢? 青蛙跳的左右方向是跟青蛙当前所在位置的奇偶性相关的,如果当前青蛙所在的整点是偶数,那么向左跳,否则向右跳。

问:青蛙跳完n次之后,青蛙所在的位置是多少?

输入格式

多组测试数据。

第一行,一个整数t。表示有t组测试数据。1<=t<=10000。

每组测试数据格式如下:

      一行,两个整数: x和n。-10^14 <= x <= 10^14,    0<=n<=10^14。

输出格式

共t行,每行一个整数。

输入/输出例子1

输入:

9

0 1

0 2

10 10

10 99

177 13

10000000000 987654321

-433494437 87178291199

1 0

-1 1

输出:

-1

1

11

110

190

9012345679

-87611785637

1

0

注意:本题作者不会,欢迎博客积极评论!!!

参考代码:

#include<bits/stdc++.h>
using namespace std;
long long t,x,n;
int main() {
    cin>>t;
    while(t--) 
	{
        cin>>x>>n;
        if(n==0)cout<<x;
        else if(n==1)
        {
        	if(x%2==0)cout<<x-n;
        	else cout<<x+n;
		}
        else 
        {
        	if(x%2==0)
        	{
        	    if(n%2==0)cout<<x+1;
       	    	else cout<<x+n+1;
      		}
    	    else 
    	    {
    	        if(n%2==0)cout<<x-1;
    	        else 
    	        {
    	        	if(x<0)cout<<x-n;
    	        	else cout<<x+n;
				}
    	    }
        }
        cout<<endl;
    }
    return 0;
}

注:本题不能用for循环,要不然会超时!!!

第9题     个位数为m的质数     时限:1s 空间:256m

1不是素数,素书即是质数。 质数的定义:一个大于1的自然数,除了1和它本身外没有其他的约数。求出n以内,个位数为m的所有质数。如果没有质数的话,输出-1

输入格式

输入两个数nm。(2<=m<=10000,1<=m<=9

输出格式

n以内个位数为m的所有质数

输入/输出例子1

输入:

100  7

输出:

 17  37  47  67  97

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,m,a;
int main(){
    cin>>n>>m;
    for(int i=m;i<=n;i=i+10)
    {
        int z=1;
        for(int j=2;j<i;j++)
        {
            if(i%j==0)
            {
                z=0;
                break;
            }
        }
        if(z==1&&i>1)cout<<i<<" ",a=1;
    }
    if(a==0)cout<<-1;
    return 0;
}
第10题     大将的勋章     时限:1s 空间:256m

经过多年的杀戮,秦皇终于统一了中国。为了抵御外来的侵略,他准备在国土边境安置n名将军。不幸的有些将军羽翼渐丰,开始展露他们的狼子野心了。他们拒绝述职、拒绝接受皇帝的圣旨。秦皇已经准备好了秘密派高手处决这些无礼的边防大将。不过为防兵变,他决定先授予这些将军一些勋章,为自己赢得战略时间。将军们听说他们即将被授予勋章都很开心,他们纷纷上书表示感谢。皇帝授予的勋章都带有一个数字编号,为了方便高手秘密处决无礼的边防大将,大将勋章编号中只有无礼的边防大将的勋章编号是一个质数。现在高手需要统计无礼的边防大将的人数,你能帮帮他吗?

输入格式

第一行,一个整数n (1<=n<=100)

第二行,n个正整数,表示大将勋章编号,数据范围为[1,100000000]。

输出格式

一行一个正整数,表示无礼的边防大将的人数。

输入/输出例子1

输入:

5

100 17 88 25 22

输出:

1

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,a,s;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        int z=1;
        for(int j=2;j<=sqrt(a);j++)
        {
            if(a%j==0)
            {
                z=0;
                break;
            }
        }
        if(z==1&&a>1)s++;
    }
    cout<<s;
    return 0;
}
第11题     秋游活动     时限:1s 空间:256m

学校举行秋游活动。 由于这次秋游活动来的人太多, 学校租了三辆大巴车来把学生运到秋游营地。 但是由于三辆车型号不一样, 所以跑一趟往返所需的时间也不一样。 小明来到停车场时, 正好见到三辆车同时发车。 好奇的他想知道, 如果他在这里等着, 过多久才能看见下一次三辆车同时发车。

输入格式

包含一行三个数, 分别表示每一辆车跑一次往返所需的分钟数(不超过 10000 分钟) , 用空格分开 。

输出格式

包含一个数, 为小明所需等待的时间(分钟数) 。

输入/输出例子1

输入:

4 6 3

输出:

12

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long a,b,c;
int main(){    
    cin>>a>>b>>c;
    //注:for循环一定要用long long定义,否则会超时
    for(long long i=a;;i+=a)
    {
        if(i%a==0&&i%b==0&&i%c==0)
        {
            cout<<i;
            return 0;
        }
    }
    return 0;
}
第12题     分解质因数      时限:1s 空间:256m

今天数学课上,桐桐学习了质数的知识:一个整数如果只能被1和它本身整除,那么这个整数便是质数。桐桐就想:任意一个正整数是否都能分解成若干个质数相乘的形式呢?输入一个正整数n(2≤n≤10^9),把它分解成质因子相乘的形式,如果为质数则输出该数本身。如:36=2*2*3*3;19=19。你能帮助桐桐解决这个难题吗?

输入格式

一个正整数n(2≤n≤10^10)

输出格式

把它分解成质因子相乘的形式,如果为质数则输出该数本身

输入/输出例子1

输入:

99

输出:

99=3*3*11

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long a,j=2,z;
int main() {
	cin>>a;
	cout<<a<<"=";
    //注:这里要先判断a是否是素数,是的话直接输出,否则在分解质因数。(要不然会超时)
    for(int i=2;i<=sqrt(a);i++)
    {
        if(a%i==0)
        {
            z=1;
            break;
        }
    }
    if(z==0)
    {
        cout<<a;
        return 0;
    }
	while(a>1)
	{ 
		if(a%j==0)
		{
			cout<<j;
			a=a/j;
			if(a!=1)cout<<"*";
		}
		else j++;
	}
	return 0;
}
第13题     约数     时限:1s 空间:256m

对于一个正整数n,如果n除以某个正整数d所得的余数为0,我们称dn的约数。显然1n一定是n的约数,请问对于给定的n(n2),除了n本身以外,最大的约数是多少?

输入格式

共一行,包含一个正整数n

【数据范围】

对于30%的数据,n100

对于50%的数据,n10^6

对于100%的数据,2n2×10^9 

输出格式

共一行,包含一个正整数,表示n除了自身以外的最大约数。

输入/输出例子1

输入:

15

输出:

5

样例解释

15的约数有1,3,5,15,除了15本身以外的最大约数为5

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n;
int main(){
    cin>>n;
    //注:要从前面开始判断(因为只有这样才能用sqrt)
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            cout<<n/i;
            return 0;
        }
    }
    cout<<1;
    return 0;
}

(博客们也可以自行修改代码,作者欢迎在评论区发修改后的代码)

格式:

第xx题:

#include<bits/stdc++.h>
using namespace std;
int main(){
    

    return 0;
}
  • 37
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值