赞
踩
现有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;
- }
汉诺塔由三根柱子(分别用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;
- }
由于近期的降雨,雨水汇集在农民小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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。