牛客小白月赛74 BC

335 阅读2分钟

B

题目链接

题目详情

牛牛有一个整数 n,他想知道这个数字所有好的划分中字典序最小的划分方案是什么。 一个好的划分是一个正整数序列,序列中所有数字的和等于 n,且序列中不存在相同的数。

输入描述:

本题采用多组案例输入,第一行一个整数 T 代表案例组数。每组案例中,输入一行一个整数代表 n。保证: 0<n1060<n≤10^6单个测试点中所有案例 n 的和不超过 10610^6

输出描述:

对于每组案例,输出一行若干个正整数代表划分出字典序最小的序列,整数之间用空格分隔。

示例

输入

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 列的格子上的数字为 Coli,jCol_{i,j}。 当牛牛处于某个格子上时,他会把所有和当前格子上数字相等的格子(包含当前格子)都标记。

牛牛可以朝上下左右任意一个方向走一步,花费的代价是 1。

牛牛可以从当前位置传送到任意一个已经被标记了的格子上,花费的代价是 0。

游戏开始时牛牛可以选择方格上任何一个格子作为起点(这一步的代价也是 1),他想知道若到每个格子至少一次他需要花费的最少代价是多少。

输入描述:

本题采用多组案例输入,第一行一个整数 T 代表案例组数。每组案例第一行输入两个空格分隔的整数:n m。接下来 n 行,每行 m 个空格分隔的整数代表 Coli,jCol_{i,j}
保证: 0<n,m1030<n,m≤10^3
0<n×m1050<n×m≤10^5
0<Coli,jn×m0<Coli,j≤n×m单个测试点中所有案例 n×m 的和不超过 2×1052×10^5

输出描述:

对于每组案例,输出一行一个整数代表牛牛所需要花费的最少代价。

示例

输入

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;
​
}