牛客小白月賽19

牛客小白月賽19


D.「金」初心如金

題意:

給n,首先給一個奇數,如果這個數是素數則ans=1,否則ans=0
接下來n-1次原本也是給一個奇數,但實際給的數=lastans^原本要給的奇數
問前n-1個數的ans是多少(是素數爲1,不是素數爲0),輸出這個ans

思路:

因爲每次給的都是奇數,而每一次實際給的數=lastans^原本要給的奇數,
所以我們可以通過實際給的數,倒推出lastans的值。
題目輸入的最後一個數不需要輸出也暗示了做法。

code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
signed main(){
    signed n;
    scanf("%d",&n);
    ll x;
    scanf("%lld",&x);
    for(int i=2;i<=n;i++){
        scanf("%lld",&x);
        if(x&1)puts("0");
        else puts("1");
    }
    return 0;
}

E.「火」烈火燎原

題意:

現在有一棵樹G(無環),定義它的“小樹”是X(G),小樹X(G)的點集是G的邊集
在“小樹”中,兩點之間有邊,當且僅當這兩個點對應的邊在原圖上有公共點
給定一棵樹G,它的X(X(G))有多少個點?

思路:

X(G)的點數是G的邊數,
假設G中點x的度爲k,即這k條邊都連接x,那麼X(G)中對應的這K個點相鄰,兩兩匹配共有k(k-1)/2個邊
所以X(G)中邊的數量就是d(i)(d(i)-1)/2,又因爲X(G)的點數是G的邊數,
所以X(X(G))的點數就是原圖中的d(i)(d(i)-1)/2

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e5+5;
int d[maxm];
signed main(){
    int n;
    cin>>n;
    for(int i=1;i<n;i++){
        int a,b;
        cin>>a>>b;
        d[a]++;
        d[b]++;
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        ans+=d[i]*(d[i]-1)/2;
    }
    cout<<ans<<endl;
    return 0;
}

H.「土」巨石滾滾

題意:

有一個土球和n個障礙
土球有一個穩定性x,如果x < 0,它會立刻散架
每衝撞一個障礙,土球會喪失ai的穩定性,衝撞之後,又會從障礙身上回饋bi的穩定性
能否合理的安排障礙的順序,在保證土球不散架的情況下,是否可以將障礙全部撞毀呢?
可以輸出yes,不可以輸出no

思路:

bzoj3709原題

貪心。
把障礙分成兩種,第一種是回覆>傷害的,按照傷害從低到高去打就是最優的。
第二種是傷害>回覆的。通過所有障礙的時候,血量一定是固定的,所以要先過回血多的,再過回血少的。

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
struct Node{
    int a,b;
};
vector<Node>l,r;
bool cmp1(Node a,Node b){
    return a.a<b.a;
}
bool cmp2(Node a,Node b){
    return a.b>b.b;
}
signed main(){
    int T;
    cin>>T;
    while(T--){
        l.clear();
        r.clear();
        int n,x;
        cin>>n>>x;;
        for(int i=1;i<=n;i++){
            int a,b;
            cin>>a>>b;
            if(a<=b)l.push_back({a,b});//回血
            else r.push_back({a,b});//掉血
        }
        sort(l.begin(),l.end(),cmp1);
        sort(r.begin(),r.end(),cmp2);
        int ok=1;
        for(auto i:l){
            if(!ok)break;
            if(x<=i.a){
                ok=0;
            }else{
                x-=i.a;
                x+=i.b;
            }
        }
        for(auto i:r){
            if(!ok)break;
            if(x<=i.a){
                ok=0;
            }else{
                x-=i.a;
                x+=i.b;
            }
        }
        if(ok)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

I


J


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章