【牛客訓練記錄】牛客周賽 Round 69

MNNUACM_2024ZY發表於2024-11-25

訓練情況

賽後反思

好吧,D 題沒想到二進位制列舉,以為 \(O(2^knm)\) 不可做。。。

A題

要求要等差數列,我們先求公差,為兩元素的最大值-最小值,再在最大值的基礎上加上公差即可。

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    int a,b; cin>>a>>b;
    cout<<max(a,b) + max(a,b) - min(a,b);
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

B題

我竟然沒想到 scanf ,我超,這題直接 scanf 讀入兩個 long long 再相減即可,寫了字串做法,字串做法就是找 , ,之後把字串變成數字,答案是 \(b-a-1\)

#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

void solve(){
    string s; cin>>s;
    int n = s.size();
    int pos = 0;
    for(int i = 0;i<n;i++){
        if(s[i] == ','){
            pos = i;
            break;
        }
    }
    int a = 0;
    for(int i = pos+1;i<n;i++){
        if(s[i] == ',') break;
        a*=10;
        a+=s[i] - '0';
    }
    for(int i = n-1;i;i--){
        if(s[i] == ','){
            pos = i;
            break;
        }
    }
    int b = 0;
    for(int i = pos+1;i<n;i++){
        b*=10;
        b+=s[i] - '0';
    }
    cout<<b-a-1<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

C題

我們考慮可以將終點關於水面進行對稱,已知中點和一邊,求另外一邊的公式為 \(2 \times mid - l\),所以我們直接 \(2 \times m - z\) 求出對稱的另一點高度,所以向量就是 \((x,y,2m-z)\),求三數的 gcd 再除化成最簡即可,這題 int 會溢位,需要開 long long。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

void solve(){
    int n,m; cin>>n>>m;
    for(int i = 1;i<=n;i++){
        int x,y,z; cin>>x>>y>>z;
        int ansx = x;
        int ansy = y;
        int ansz = 2*m-z;
        int g = __gcd(ansx,__gcd(ansy,ansz));
        cout<<ansx/g<<" "<<ansy/g<<" "<<ansz/g<<endl;
    }
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

相關文章