给定一个正整数 N ,然后将 N 分解成 3 个正整数之和。
计算出共有多少种符合要求的分解方法。
要求:
分解的 3 3 3个正整数各不相同;
分解的 3 3 3个正整数中都不含数字3和7.
如:N为8,可分解为 ( 1 , 1 , 6 ) (1,1,6) (1,1,6)、 ( 1 , 2 , 5 ) (1,2,5) (1,2,5)、 ( 1 , 3 , 4 ) (1,3,4) (1,3,4)、 ( 2 , 2 , 4 ) (2,2,4) (2,2,4)、 ( 2 , 3 , 3 ) (2,3,3) (2,3,3),其中满足要求的分解方法有 1 1 1种,为 ( 1 , 2 , 5 ) (1,2,5) (1,2,5)。
输入描述
输入一个正整数 N ( 5 < N < 501 ) N (5<N<501) N(5<N<501),表示需要分解的正整数。
输出描述
输出一个整数,表示共有多少种符合要求的分解方法。
用例输入 1
8
用例输出 1
1
解答:
这道题算出三个数判断就行
cpp
#include <bits/stdc++.h>
using namespace std;
bool check(int x)//这个函数用来判断x是否含有7或3
{
while(x!=0)
{
if(x%10==3||x%10==7) return 0;
x=x/10;
}
return 1;
}
int main()
{
int n,cnt=0;
cin>>n;
for(int i=1;i<=n-1;i++)
{
for(int j=i+1;j<=n-1;j++)
{
int k=n-i-j;//算出第三个数
if(k<=j||check(i)==0||check(j)==0||check(k)==0) continue;
cnt++;
}
}
cout<<cnt;
return 0;
}
数池塘(四方向)
题目描述
由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 N × M ( 1 ≤ N ≤ 100 , 1 ≤ M ≤ 100 ) N\times M(1\leq N\leq 100, 1\leq M\leq 100) N×M(1≤N≤100,1≤M≤100) 的网格图表示。每个网格中有水(W
) 或是旱地(.
)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。
输入第 1 1 1 行:两个空格隔开的整数: N N N 和 M M M。
第 2 2 2 行到第 N + 1 N+1 N+1 行:每行 M M M 个字符,每个字符是 W
或 .
,它们表示网格图中的一排。字符之间没有空格。
输出一行,表示水坑的数量。
样例输入 #1
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
样例输出 #1
3
这道题用广度优先遍历
cpp
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
char g[110][110];
int dx[]={-1,0,1,0},
dy[]={0,-1,0,1},n,m,cnt;//偏移数组
void bfs(int x,int y)
{
queue<PII> q;
q.push({x,y});
g[x][y]='.';
while(q.size()!=0)
{
PII p=q.front();q.pop();
x=p.first,y=p.second;
for(int i=0;i<4;i++)
{
int a=dx[i]+x,b=dy[i]+y;
if(a<1||a>n||b<1||b>m) continue;//检查有没有越界
if(g[a][b]=='.') continue;
q.push({a,b});
g[a][b]='.';
}
}
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>g[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(g[i][j]=='W')
{
cnt++;
bfs(i,j);
}
}
}
cout<<cnt;
return 0;
}
手工课上老师拿出 N N N 张长方形彩纸,且每张彩纸上都画着 W × H W\times H W×H 的网格(网格铺满整张彩纸)。现在老师将 N N N 张彩纸裁剪出 K K K 张大小相同的正方形,并且要使裁剪出的正方形的边长最大(裁剪的正方形边长必须为整数)。
例如: N = 2 N=2 N=2,有 2 2 2 张彩纸,第一张彩纸 W = 4 W=4 W=4, H = 3 H=3 H=3,第二张彩纸 W = 5 W=5 W=5, H = 4 H=4 H=4; K = 6 K=6 K=6,裁剪的 6 6 6 个正方形边长最大是 2 2 2。
当给出 N N N 张长方形彩纸 W W W 和 H H H,及 K K K 的值,请计算出将 N N N 张彩纸裁剪出 K K K 张大小相同的正方形,正方形的边长最大是多少(裁剪的正方形边长必须为整数)。
输入描述
第一行输入两个正整数 N N N, K ( 1 < N < 100 , 1 < K < 100 ) K (1<N<100,1<K<100) K(1<N<100,1<K<100), N N N 表示彩纸数量, K K K 表示需裁剪的正方形数量,两个正整数之间一个空格隔开;
第二行开始,输入 N N N 行,每行输入两个正整数 W W W 和 H H H, ( 1 < W < 1000 , 1 < H < 1000 ) (1<W <1000,1<H <1000) (1<W<1000,1<H<1000)
表示彩纸的宽度,两个正整数之间一个空格隔开。
输出描述
输出一个正整数,表示将 N N N 张彩纸裁剪出 K K K 张大小相同的正方形的边长最大是多少(裁剪的正方形边长必须为整数),如果不能裁剪出 K K K 张正方形就输出-1。
输入
2 6
4 3
5 4
输出
2
解答:
cpp
#include <bits/stdc++.h>
using namespace std;
int a[110],b[110],n,k;
int f(int g)
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=(a[i]/g)*(b[i]/g);
}
return sum;
}
int main()
{
int x=0;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
x=max(x,max(a[i],b[i]));//把这三个数打擂台
}
for(int i=x;i>=1;i--) if(f(i)>=k) {cout<<i;return 0;}
cout<<-1;
return 0;
}