C++练习题目

文章开始前的废话:

        今天我们来开一个新坑--C++!!

        不废话上图片:

        わあ、かっこいい、私はもう陥落した。(并不想让您们知道什么意思,就不说中文了) 

题目一:

        题目:

输入一个长度为n的数组,输出他的最大值和最小值。

        输入:

             第一行一个整数n,表示数组长度,1≤n≤100000;
             接下来n行,每行一个整数ai,表示数组的内容,-2147483648≤ai≤2147483647。

        输出:

             输出一行两个数字,用空格分开,分别表示最小值和最大值。

        数据范围:

             对于30%的数据,1≤n≤5;
             对于60%的数据,1≤n≤1000;
             对于100%的数据,1≤n≤100000,-2147483648≤ai≤2147483647。

        输入样例:

             3
             -1
             0
             1

        输出样例:

             -1 1

        思路:               

将最大值的初始值分别于每个数比较,如果初始值小于这个数则更新最大值,最小值同理。

特别注意最值的初始化,最简单的方法就是初始化成a[0]这样一定不会有错。

否则就要初始化成-2147483648和2147483647。

        代码: 

#include <bits/stdc++.h>
using namespace std;
const int MaxN = 100000;
int a[MaxN + 5]
int main() 
{ 
    cin >> n:
    for (int i = 1;i <= n;i++) cin >> a[i];
    int MaX = a[1];
    int MiN = a[1];
    for (int i = 1;i <= n;i++) {
        MaX = max(MaX,a[i]);
        MiN = min(MiN,a[i]);
    }
    cout << MiN << ' ' << MaX << endl;
	return 0;
}

题目二:

        题目:

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天

和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后

四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续

下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金

币。

请计算在前K天里,骑士一共获得了多少金币。

        输入:

        输入只有1行,一个正整数K,表示发放金币的天数(k <= 10000)。

        输出:   

        输出只有1行,一个正整数,即骑士收到的金币数。

        输入样例:

        6

        输出样例:     

        14

        思路:               

根据题意,我们可以将骑士得到金币的天数分为若干组:第1天为一组,每天1枚金币;第2、3天为一组,每天2枚金币;第4、5、6天为一组,每天3枚金币,以此类推......

由于K<=10000,所以我们可以直接暴力对每天获得金币求和,初始i=1,每天金币数+i,i天后i++,一直循环直到总天数为K;

更进一步的思路:我们可以判断一下K天一共包含了多少“组”。

假定K天一共有x组,

那么这x组共包含了1+2+3+...+x=(x+1)x21+2+3+...+x=(x+1)x2天,所得金币数为12+22+33+...+x2=x(x+1)(2x+1)612+22+33+...+x2=x(x+1)(2x+1)6.

而剩余的天数K−x(x+1)2K−x(x+1)2中,每天所得金币数为x+1。

那么剩下的问题就在于如何求解x了

可以使用for语句按1+2+3+...进行累加,当累加和达到K时循环结束;

另一种方法是,由于K天中不能包含x+1组,因此(x+1)x2≤K≤(x+1)(x+2)2(x+1)x2≤K≤(x+1)(x+2)2,

可得x2<(x+1)x≤2K≤(x+1)(x+2)<(x+2)2x2<(x+1)x≤2K≤(x+1)(x+2)<(x+2)2

那么⌊2K−−−√⌋⌊2K⌋一定为x与x+1中的一个值(⌊⌋⌊⌋表示向下取整)。

可以令t=⌊2K−−−√⌋t=⌊2K⌋,判断(t+1)t2(t+1)t2与K的大小关系从而确定是x还是x+1。

        代码1:

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int h=0;
    int l = 1 , i , sum = 0;
    for( i=1;i<=n;i+=l)
    {
        sum+=l*(i-h);
        l++;
        h=i;
    }
    if(i!=n)
    {
        sum+=(n-h)*l;
    }
    cout<<sum;
}

        代码2:

#include <bits/stdc++.h>
using namespace std;
int k;
int coin_num,days,ans = 0;
int main() 
{ 
    cin >> k;
    coin_num = 1;
    days = 1;
    for (int i = 1;i <= k;i++) {
    ans += coin_num;
    days--;
        if (days == 0) {
            coin_num++;
            days = coin_num;
        }
    }
    cout << ans << endl;
	return 0;
}

题目三:

        题目:

数独是一类广受大众喜欢的填数游戏。最典型的数独由9*9的方格组成,其中会填入一些1~9

的数字。玩家需要补上剩余格子的数字,使得每个格子所在的行、列、小九宫格都包含有

1~9的数字,不重不漏

现在小明已经做好了一些填好了所有数字的数独游戏题面,正准备挖空。但在此之前,他希

望你帮忙检查一下题面是否正确,即做好的题面是否每个格子都满足所在行、列、小九宫格

都包含1~9。 

        输入:

        第一行输入一个数T,表示小明已完成的数独题面个数。
        之后每个题面输入共9行,每行9个数以空格隔开,表示填好的数独中的数字。

        输出:   

        输出共T行,每行一个字符串表示该数独题面是否正确。
        正确输出"YES",错误则输出"NO"。

         数据范围:

        对于100%的数据,1≤T≤5,1≤每个数字≤9。

        输入样例:

        2
        7 6 2 5 9 3 1 4 8
        9 4 1 2 7 8 5 3 6
        8 3 5 4 6 1 7 9 2
        1 9 8 6 2 7 3 5 4
        4 7 6 3 5 9 2 8 1
        2 5 3 8 1 4 6 7 9
        3 8 7 1 4 6 9 2 5
        5 1 4 9 3 2 8 6 7
        6 2 9 7 8 5 4 1 3
        8 1 4 7 3 2 6 5 9
        9 2 3 6 5 8 1 4 7
        5 7 6 4 9 1 2 8 3
        3 4 5 2 6 7 8 9 1
        1 8 9 3 4 5 3 2 6
        2 6 7 1 8 9 5 3 4
        7 5 1 9 2 4 7 6 8
        4 3 8 5 7 6 9 1 2
        6 9 2 8 1 3 4 7 5

        输出样例:     

        YES
        NO

        思路:               

用二维数组存储每个数独的数据,然后再对每行、每列、以及9个3*3的大格都是否包含1~9的数字各一个即可。

需要注意两点:

(1)1~9都必须各一个,并非每行、每列、每个九宫格数字之和全为45就能满足题意;

(2)每个九宫格也需要判定是否包含1~9,仅满足每行、每列含1~9不一定满足题意。

        代码:

#include <bits/stdc++.h>
using namespace std;

int main() 
{ 
    //累了,毁灭吧,我还要去刷手机呢,下期再写
	return 0;
}

文章结束前的废话:

        中文:

                好的,那么这篇文章到这里就结束了,那我们下期再见吧!

        日语:

                はい、では、この文章はここで終わります。じゃ、次の号でまた会いましょう。

        英文:

                OK, so this article ends here. Let's see you in the next issue!

                (没想到吧!博主不止会日语还会英语)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值