C++ 语言基础

【题目描述】

n元人民币换成1元、2元、5元的零钱,请计算共有多少种兑换方法?

【输入描述】

输入一行,包含一个整数n

1 <= n <= 200

【输出描述】

输出一行,包含一个整数

【输入】

100

【输出】

541

AC代码1:

int main()
{
    int n, count = 0;
 
    cin >> n;
    for(int i = 0; i <= n/5; i++)
    {
        for(int j = 0; j <= n/2; j++)
        {
            if((i*5 + j*2) > n)
            {
                break;
            }
            for(int k = 0; k <= n; k++)
            {
                if((i*5 + j*2 + k) > n)
                {
                    break;
                }
                else if((i*5 + j*2 + k) == n)
                {
                    count++;
                }
            }
        }
    }
    cout << count << endl;
 
    return 0;
}

AC代码2:只需考虑5元和2元,只要不超过n,剩下的全换1元即是1种方法

int main()
{
    int n, count = 0;
 
    cin >> n;
    for(int i = 0; i <= n/5; i++)
    {
        for(int j = 0; j <= n/2; j++)
        {
            if((i*5 + j*2) > n)
            {
                break;
            }
            else
            {
                count++;
            }
        }
    }
    cout << count << endl;
 
    return 0;
}

AC代码3:先取出i张5元,剩下的钱只用2元和1元。则剩下的钱,只用1元为1种方法,能换1张2元则多一种方法,即剩下的钱/2+1种方法

#include<iostream>
using namespace std;
int main(){
	int n, sum=0;
	cin >> n;
	for(int i = 0; i <= n/5; i++){
		sum += (n - i*5)/2 + 1;
	}
	cout << sum;
	return 0;
}

【题目描述】

n个人(0,1,2,3,4...n-1),围成一圈,从编号为k的人开始报数,报数报到m的人出队(报数是1,2,...m这样报的)。下次从出队的人之后开始重新报数,循环往复,当队伍中只剩最后一个人的时候,那个人就是大王。现在,给定n,k,m,
请你求出大王的编号。

【输入描述】

输入一行包含三个整数n,k,m

1<=n<=100,1<=k<=n-1,1<=m<=100

【输出描述】

输出一个整数

【输入】

5 1 2

【输出】

3

AC代码:

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> table; //建立一个数组table
	int i, n, k, m, pos;
	cin >> n >> k >> m;
    pos = k;
	for(i = 0; i < n; i++){
	    table.push_back(i); //初始化 等价于table[i]=i;
	}
	for(i = 0; i < n-1; i++){
	    pos = (pos+m-1)%table.size(); //删除元素下标
		table.erase(table.begin() + pos); //删除元素
	}
	cout << table[0] << endl;
	return 0;
}

【题目描述】

给你一个整数n,按要求输出n∗n的回型矩阵

【输入描述】

输入一行,包含一个整数n

1<=n<=19

【输出描述】

输出n行,每行包含n个正整数.

【输入】

4

【输出】

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

AC代码:

#include <cstdio>
#include <iostream>
using namespace std;
const int N = 100;
int arr[N][N];
int main(){
    int n;
    cin >> n;
    int index, i, j;
    i = j = 0;
    index = 1;
    while(index <= n*n){
        while(arr[i][j] == 0 && j < n)
            arr[i][j ++] = index ++;
        j --; //回退一格
        i ++; //下移一行

        while(arr[i][j] == 0 && i < n)
            arr[i++][j] = index ++;
        i --;
        j --;

        while(arr[i][j] == 0 && j >= 0)
            arr[i][j --] = index ++;
        j ++;
        i --;

        while(arr[i][j] == 0 && i >= 0)
            arr[i --][j] = index ++;
        i ++;
        j ++;
    }
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            printf("%d ",arr[i][j]);
        }
        cout << endl;
    }
    return 0;
}
  • 过山车
     

    【题目描述】

    牛牛想要挑战一下自己的勇气,于是打算去玩牛村的刺激过山车,牛村的刺激过山车一排只坐一个人,牛牛胆子比较小,所以他要求必须坐在前面有人或者后面有人的空位置

    牛牛上车前只知道这批过山车总共有n个位置,已经有k个人坐上去了,请帮助牛牛计算一下最少有多少个位置符合他的要求,最多有多少个位置符合他的要求。

    注:第一个位置的前面和最后一个位置的后面我们认为是没有人。

    【输入描述】

    一行两个整数n,k。
    
    n≥k≥0

    【输出描述】

    输出两个整数表示最少和最多的符合他要求的位置
    

    【输入】

    6 3

    【输出】

    1 3
    

    【输入】

    6 2

    【输出】

    1 4

思路:审题要清晰

先排除特殊情况:

(1)如果 k == 0,即过山车上一个人也没有,由于牛牛必须坐在前面有人或者后面有人的空位置,此时过山车上没有符合牛牛要求的位置,故最少和最多符合他要求的位置都为 0 ;

(2)如果 k == n,即过山车已经坐满,此时已经没有位置了,故最少和最多符合他要求的位置都为 0;

再看一般情况:由于牛牛必须坐在前面有人或者后面有人的空位置,故最少符合他要求的位置为 1 ,主要考虑最多符合他要求的位置,我们可以三个位置分为一组,比如 n = 6,k = 2,最多的情况为 010 010,此时牛牛有 4 个位置可以选择;再比如 n = 8, k = 2,最多的情况为 010 010 00,此时牛牛有 4 个位置可以选择;再比如 n = 4,k = 2,最多的情况为 010 1,此时牛牛有 2 个位置可以选择;由此,当 n >= k*3 时,maxn = 2*k;否则,maxn = n-k;

注意:此题 long long 也是一个坑点;

AC代码:

#include<iostream>
using namespace std;
int main(){
    long long n,k,min=0,max=0;
    cin>>n>>k;
    if(n==k||k==0);
    else{
        min=1;
        if(n>=3*k){
            max=k*2;
        }
        else{
            max=n-k;
        }
    }
    cout<<min<<" "<<max<<endl;
    return 0;
}

【题目描述】

给你一个整数n,输出n∗n的蛇形矩阵。

【输入描述】

输入一行,包含一个整数n

【输出描述】

输出n行,每行包含n个正整数,通过空格分隔。

1<=n<=1000

【输入】

4

【输出】

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

 AC代码:

#include<cstdio>
int main(){
int n,i=0,j=0,x=0;
int a[1000][1000];
scanf("%d",&n);
for(i=0;i<2*n-1;i++){
    for(j=i;j>=0;j--){
        if(j<n&&(i-j)<n)
            x++;
        if(i%2==0)
        a[j][i-j]=x;
        else
            a[i-j][j]=x;
    }
}
for(i=0;i<n;i++){
    for(j=0;j<n;j++){
        printf("%d ",a[i][j]);
    }
    printf("\n");
    }
}

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值