问题A 奇特的分组:
题目描述
现有N个整数和一个整数M,小C想到一种有趣的组合方法,他想把连续的相加不大于M的整数分成一组,然后输出每一组的起始和终止编号,如果每组整数数量不同,在满足题意下保证分组尽可能少,若有多种分法,则保证并前面的小组整数个数少,后面的小组整数个数多。
例如:1 3 4 6 2 5 7 七个整数,
给定M=8,则输出为:
1 - 3
4 - 4
5 - 6
7 - 7
输入
第一行,两个整数n和m,n表示一共有n个整数,m表示给定的每组最大值。 n,m≤1000
第二行,n个整数。 每个整数大小不超过m
输出
数行,每行一个范围。
样例输入
7 8
1 3 4 6 2 5 7
样例输出
1 - 3
4 - 4
5 - 6
7 - 7
提示
数据保证不存在0-0的情况。
解题
#include<bits/stdc++.h>
using namespace std;
int n,m,a[10001];
void f(int n){
int sum=0;
for(int i=n;i>=1;i--){
if(sum+a[i]<=m){
sum+=a[i];
if(i==1){
cout<<1<<" - "<<n<<endl;
return ;
}
}
else{
f(i);
cout<<i+1<<" - "<<n<<endl;
return ;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
f(n);
return 0;
}
问题B 汉诺塔问题:
题目描述
汉诺塔由三根柱子(分别用A、B、C表示)和n个大小互不相同的空心盘子组成。一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体。
对汉诺塔的一次合法的操作是指:从一根柱子的最上层拿一个盘子放到另一根柱子的最上层,同时要保证被移动的盘子一定放在比它更大的盘子上面(如果移动到空柱子上就不需要满足这个要求)。我们可以用两个字母来描述一次操作:第一个字母代表起始柱子,第二个字母代表目标柱子。例如,A-->B就是把柱子A最上面的那个盘子移到柱子B。汉诺塔的游戏目标是将所有的盘子从柱子A移动到柱子B或柱子C上面。
现在已知A柱子上有N个盘子,要把所有N个盘子移动到C柱子上,请输出每一次操作的具体步骤(N≤30)
如两个盘子的情况:
A-->B
A-->C
B-->C
输入
一个数n,表示有n个圆盘。
输出
若干行表示具体操作过程
样例输入
2
样例输出
A-->B
A-->C
B-->C
解题
#include<bits/stdc++.h>
using namespace std;
void hanoi(int n,char a,char b,char c){
if(n==1){
cout<<a<<"-->"<<c<<endl;
return ;
}
hanoi(n-1,a,c,b);
cout<<a<<"-->"<<c<<endl;
hanoi(n-1,b,a,c);
return ;
}
int main(){
int n;
cin>>n;
hanoi(n, 'A','B','C');
return 0;
}
问题C 水坑的数量:
题目描述
由于近期的降雨,雨水汇集在农民小F的田地不同的地方。
我们用一个 N×M(1≤N≤100,1≤M≤100) 的网格图表示。每个网格中有水( W ) 或是旱地( . )。
一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。
小F想弄清楚他的田地已经形成了多少水坑。给出小F田地的示意图,确定当中有多少水坑。
输入
输入第 1 行:两个空格隔开的整数:N 和 M。
第 2 行到第 N+1 行:每行 M 个字符,每个字符是 W 或 .,它们表示网格图中的一排。字符之间没有空格。
输出
输出一行,表示水坑的数量。
样例输入
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
样例输出
3
解题
#include<bits/stdc++.h>
using namespace std;
char a[1001][1001];
void find(int x,int y){
a[x][y]='m';
if(a[x+1][y]=='W') find(x+1,y);
if(a[x-1][y]=='W') find(x-1,y);
if(a[x][y+1]=='W') find(x,y+1);
if(a[x][y-1]=='W') find(x,y-1);
if(a[x+1][y+1]=='W') find(x+1,y+1);
if(a[x-1][y-1]=='W') find(x-1,y-1);
if(a[x-1][y+1]=='W') find(x-1,y+1);
if(a[x+1][y-1]=='W') find(x+1,y-1);
return;
}
int main(){
int n,m,ans=0;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='W'){
find(i,j);
ans++;
}
}
}
cout<<ans;
return 0;
}