河北大學選拔賽補題

Alaso_shuang發表於2024-11-20

選拔賽補題

A.級數求和

思路:直接求和再去判斷即可


B.P4702 取石子(很好的一道思維題)

思路:其實拿到的時候有點感覺但不多開始模擬,於是我就用 n = 1,a[1,2,3,4]一直開始模擬,我得出了看最後狀態的結論,最後用每一次最後的狀態推出每個人在奇偶狀態的勝率,最後推得Alice在奇數狀態下會win,Bob則在偶數狀態下會win

#include<iostream>
using namespace std;
const int N = 1e7+10;
int a[N];
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,sum = 0;cin>>n;
    for(int i = 1;i <= n;i++)
    {
        int x;cin>>x;
        sum += x;//目的是計算總量
    }
     if(sum & 1)cout<<"Alice"<<'\n';
    else cout<<"Bob"<<'\n';
    return 0;
}


C.P8480 「HGOI-1」PMTD

思路:我服了這題要考慮範圍,不開 long long 真的離譜了
就是不需要考慮減法和除法(因為會使得資料減小)考慮加法和乘法即可,小學都知道,乘一個比1小的數,新得的數會比原來的數更小;因此可以得出特判條件!!

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
const int N = 1e7+10;
ll a[N];
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    ll n,m;
    cin>>n>>m;
    for(ll i = 1;i <= n;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    while(m--)
    {
        if(a[n] <= 1)a[n] += 2;
        else a[n] *= 2;
    }
    cout<<a[n] - a[1]<<'\n';
    return 0;
}


D.P1150 Peter 的煙

思路:又是抽象的一題,我是用cnt和sum分別記錄能換多少個和一共能得到多少個

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    int n,k,cnt = 0,sum = 0;
    cin>>n>>k;
    cnt = n;
    sum = n;
    while(cnt >= k)
    {
       cnt -= k;//能換多少個
       sum ++;//把換掉的重新累加上
       cnt ++;//繼續累加換掉的瓶子
    }
    cout<<sum<<'\n';
    return 0;
}

相關文章