分数字
题目描述
现有N件不可区分的物品,将它们分成10份,要求每份在1~3件之间,问有多少种方案,并按字典序输出所有方案。
输入格式
一个整数,表示N<=10000N<=10000。
输出格式
第一行一个数M,表示方案数。
接下来M行每行10个整数,表示1种方案。
样例数据
input
11
output
10
1 1 1 1 1 1 1 1 1 2
1 1 1 1 1 1 1 1 2 1
1 1 1 1 1 1 1 2 1 1
1 1 1 1 1 1 2 1 1 1
1 1 1 1 1 2 1 1 1 1
1 1 1 1 2 1 1 1 1 1
1 1 1 2 1 1 1 1 1 1
1 1 2 1 1 1 1 1 1 1
1 2 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1
十重循环,暴力枚举。
#include<bits/stdc++.h>
using namespace std;
int dd[100000][10];
int main()
{
freopen("allot.in","r",stdin);
freopen("allot.out","w",stdout);
int n,ans=0;
cin>>n;
for (int a=1;a<=3;++a)
for (int b=1;b<=3;++b)
for (int c=1;c<=3;++c)
for (int d=1;d<=3;++d)
for (int e=1;e<=3;++e)
for (int f=1;f<=3;++f)
for (int g=1;g<=3;++g)
for (int h=1;h<=3;++h)
for (int i=1;i<=3;++i)
for (int j=1;j<=3;++j)
if (a+b+c+d+e+f+g+h+i+j==n)
{
ans++;
dd[ans][1]=a;
dd[ans][2]=b;
dd[ans][3]=c;
dd[ans][4]=d;
dd[ans][5]=e;
dd[ans][6]=f;
dd[ans][7]=g;
dd[ans][8]=h;
dd[ans][9]=i;
dd[ans][10]=j;
}
printf("%d\n",ans);
for (int i=1;i<=ans;++i)
for (int j=1;j<=10;++j)
if (j==10) cout<<dd[i][j]<<'\n';
else cout<<dd[i][j]<<' ';
fclose(stdin);fclose(stdout);
return 0;
}
流星雨
题目描述
流星雨是美丽的,但是流星落下来也能砸死人的。
有一大片流星要在海亮教育园的操场落下,而小x恰好在操场数星星。小x面临最大的问题不是浪漫,而是保住小命。
我们把海亮教育园的操场认为是坐标系的第一象限(以样例解释的图例为准)。小x现在位于坐标系的原点。
现在有M颗流星会落在海亮教育园的操场上,其中第i颗流星会在时刻T_i砸在坐标为(X_i, Y_i)的格子里。流星的力量会将它所在的格子,以及周围4个相邻的格子都化为焦土,当然小x也无法再在这些格子上行走,这样他会被烧伤。
小x从0时刻开始逃离,他只能上下左右移动,并且一个时刻只能移动一个格子,当然,这个格子必须是完好的。
现在小x想知道,最少经过多少时刻,他可以到达一个安全的格子。
输入格式
一个正整数M 接下来M行,每行3个整数Xi,Yi和Ti。分别表示第i颗流星落下的坐标和时间。保证所有坐标都在第一象限。
输出格式
一个整数,表示最少逃离时刻。如果逃离不了,那么输出-1,表示小x肯定被流星砸着了。
样例数据
input
4
0 0 2
2 1 2
1 1 2
0 3 5
output
5
题解
这道题问的是逃亡的最小时间,显然求诸如最小距离之类的问题我们都应该选择bfs来完成。
我们先预处理每一个点变成不能经过的点的最小时间,永远安全的点为正无穷。
从起点开始跑广搜,只要扩展节点的时候判断当前实现经过该节点是否安全即可。
CODE
#include<bits/stdc++.h>
using namespace std;