B
题目链接
题目详情
牛牛有一个整数 n,他想知道这个数字所有好的划分中字典序最小的划分方案是什么。 一个好的划分是一个正整数序列,序列中所有数字的和等于 n,且序列中不存在相同的数。
输入描述:
本题采用多组案例输入,第一行一个整数 T 代表案例组数。每组案例中,输入一行一个整数代表 n。保证: 单个测试点中所有案例 n 的和不超过
输出描述:
对于每组案例,输出一行若干个正整数代表划分出字典序最小的序列,整数之间用空格分隔。
示例
输入
3
4
7
10
输出
1 3
1 2 4
1 2 3 4
解题思路
模拟题,根据题目意思我们可以从小的数一个个枚举(从1开始)开始枚举,如果n-当前数要比当前数大的话,就输出当前数,并且把n减去i。另外,如果n==i直接输出i即可,并退出循环。
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define int long long
#define endl '\n'
typedef long long ll;
const int N =20005;
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
if(n-i>i)
{
cout<<i<<" ";
n -= i;
}
if(n-i==0)
{
cout<<i<<" ";
break;
}
}
cout<<endl;
}
return 0;
}
C
题目描述
牛牛在玩一款游戏,这款游戏的地图可以被看作是一个 n 行 m 列的方格图,每个格子上都有一个数字,第 i 行第 j 列的格子上的数字为 。 当牛牛处于某个格子上时,他会把所有和当前格子上数字相等的格子(包含当前格子)都标记。
牛牛可以朝上下左右任意一个方向走一步,花费的代价是 1。
牛牛可以从当前位置传送到任意一个已经被标记了的格子上,花费的代价是 0。
游戏开始时牛牛可以选择方格上任何一个格子作为起点(这一步的代价也是 1),他想知道若到每个格子至少一次他需要花费的最少代价是多少。
输入描述:
本题采用多组案例输入,第一行一个整数 T 代表案例组数。每组案例第一行输入两个空格分隔的整数:n m。接下来 n 行,每行 m 个空格分隔的整数代表 。
保证:
单个测试点中所有案例 n×m 的和不超过 。
输出描述:
对于每组案例,输出一行一个整数代表牛牛所需要花费的最少代价。
示例
输入
3
2 1
2
2
1 1
1
2 3
1 2 3
2 3 4
输出
1
1
4
解题思路
一上来还以为是bfs,结果很简单,就是统计不同数字的个数。 因为走相同的数代价是0,所以每一个不同的数只需要统计一次,另外从一个点走到另一个不同点和第一次选点都需要1的代价。 总的来说就是统计不同数的个数。这里可以用map或set来求都可以。
AC代码
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
#define int long long
#define endl '\n'
const int N =10000;
int a[N][N];
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
//map<int,int> mp;
set<int> se;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
//mp[a[i][j]]++;
se.insert(a[i][j]);
}
cout<<se.size()<<endl;
}
return 0;
}