The 2024 CCPC National Invitational Contest (Northeast) ADEJ

nannandbk發表於2024-10-17

The 2024 CCPC National Invitational Contest (Northeast) ADEJ

A.PaperWatering

思路:有兩種型別的操作,對一個數開根號或平方。

平方沒有什麼問題,開根號由於是向下取整再平方就會產生不一樣的數。

那麼做法也很簡單了。

對於一個數\(x\)\(k\)步,首先它能平方往後變\(k\)步,往前能變\(min(開根能變的步數,k)\)。我們去看往前開根的數,如果它的平方不等於它的下一個數,那麼它的貢獻就是\((k-x變成它的個數)\)

注意,如果變成了1,它將不會產生任何貢獻了。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;


int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    ll x,k; cin>>x>>k;
    if(x == 1)
    {
        cout<<1<<"\n";
        return 0;
    }

    ll tmp = x;
    ll used = 0;

    ll ans = k;

    ll cnt = 0;
    while(x != 1)
    {
        
        cnt++;
        if(cnt < k && (ll)sqrt(x)*(ll)sqrt(x) != x && (ll)sqrt(x) != 1)
        {
            // cout<<"(ll)sqrt(x) = "<<(ll)sqrt(x)<<" k-cnt = "<<k-cnt<<"\n";
            ans += (k-cnt);
        }
        x = (ll)sqrt(x);
        // cout<<"x = "<<x<<"\n";
    }
    cout<<ans + min(cnt,k)+ 1ll<<"\n";
    return 0;
}

這題本身難度不大,但是寫的時候還是出了問題。

一開始是認為找到第一個完全平方數就停止。其實並不是的,因為完全平方數開根之後不一定也是完全平方,所以需要看前面的所有數。

D.nIMgAME

思路:好好好,這題就充分體現了出題人的惡趣味了。一開始以為是正經博弈找規律。考慮他什麼時候能贏?寫了前幾個之後發現,都不可能贏啊,他贏的條件實在是太難了。就想難不成永遠都是lose?交一發,好好好過了。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        ll n; cin>>n;
        cout<<"lose\n";
    }


    return 0;
}

E.Checksum

思路:考慮去列舉B有i個1。總的1的個數就是\(i+cnt(A中1的個數)\)。然後去check:\(C=i+cnt\)對應的二進位制的低位k個1的個數\(D\)(如果大於k位就截掉,小於k位就補0),是否等於我們列舉的\(i\)

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        ll n,k; cin>>n>>k;

        int cnt = 0;
        string s; cin>>s;
        for(int i = 0;i < s.size(); i++)
            cnt += (s[i]=='1');
       
        string ans = "99999999999999999999";
        for(int i = 0;i <= k; i++)
        {
            ll now = cnt+i;//十進位制B
            string t = "";//二進位制低k位B
            while(now && t.size() < k)
            {
                t += ((now&1) + '0');
                now >>= 1;
            }
            for(int j = t.size();j < k; j++)
                t += '0';
            reverse(t.begin(),t.end());
            int cnt1 = count(t.begin(),t.end(),'1');//二進位制B中1的個數
            if(cnt1 == i)
                ans = min(ans,t);
        }

        if(ans == "99999999999999999999")cout<<"None\n";
        else cout<<ans<<"\n";

        
        
    }

    return 0;
}

J. Breakfast

簽到不多說。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    double n, m; cin>>n>>m;
    printf("%.2lf\n",0.6*n+m);


    return 0;
}

相關文章