浙江机电职业技术学院第八届新生亮相赛(同步赛)(小白)

youhualiuh / 2024-01-25 / 原文

B.山里灵活

/* 
原石 n * 10个
k颗 -> 一次 -> 90保底 * 7次到满命 -> 630
即可推出公式为 n * 10 / 630 >= k
 */
#include <bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;

void solve() {
    ll n, k; cin >> n >> k;
    cout << (n * 10 / 630 >= k ? "SHENLILINHUA WO LAI LA!!!\n" : "SHENLILINHUA DENG DENG WO!!!\n");
}
    
int main()
{
    IO;
    int _; cin >> _;
    while(_--) {
        solve();
    }
    return 0;
}

  

C.数列排序

/* 
lower_bound(b + 1, b + n + 1, a[i]) - b ->这里是返回第一个大于或等于被查的数的索引

upper_bound((b + 1, b + n + 1, a[i]) - b -> 则是第一个大于的被查的数的索引

lower_bound -> greater<int>()这个代替a[i]就是第一个小于或等于被查数的索引 and upper_bound -> greater<int>() 第一个小于被查数的值
 */
#include <bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N = 1e5 + 5;
 
int a[N], b[N], n, cnt, k;
bool vis[N];
 
int main()
{
    IO;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i]; b[i] = a[i];
    }
    sort(b + 1, b + n + 1);
 
    for (int i = 1; i <= n; i++) {
        a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b;
    }
 
    cnt = n;
 
    for (int i = 1; i <= n; i++) {
        if (!vis[i]) {
            --cnt;
            k = i;
            while (!vis[k]) {
                vis[k] = 1; k = a[k];
            }
        }
    }
    return cout << cnt << '\n', 0;
}