【题目描述】
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");
}
}