牛客寒假集训3

A

签到.

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int t;
string a,b;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>t;
    while(t--) {
        cin>>a;
        cin>>b;
        if(a[0]-'a' == b[0]-'a' || a[0]-'A' == b[0]-'a' || a[0]-'a' == b[0]-'A' || a[0]-'A' == b[0]-'A') cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;
}

B

先不考虑交换操作,当$n$ 为奇数时,先手必胜,$n$ 为偶数时,后手必胜。而对于交换操作,分类讨论分析一下后我们发现,每次交换对于可操作数字总数只会产生偶数的变化,不会影响上述结论.

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int t,n;
int a[30],b[30],c[30],cnt,sum;
void solve() {
    if(n & 1) cout<<"qcjj\n";
    else cout<<"zn\n";
    return;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>t;
    while(t--) {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        solve();
    }
    return 0;
}

C

马拉车板子题,等复习过字符串算法后再补题

D

暴力枚举所有的交换操作,做 $n$ 次最大字段和即可.

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int n,k;
int a[1010];
LL ans=1e18,dp[1010];
void getans() {
    for(int i=1;i<=n;i++) {
        dp[i]=a[i]+max(dp[i-1],0ll);
        ans=max(ans,dp[i]);
    }
    for(int i=1;i<=n;i++) dp[i]=0;
    return;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    ans=-ans;
    if(k == 0) getans();
    else {
        for(int i=1;i<n;i++) {
            swap(a[i],a[i+1]);
            getans();
            swap(a[i],a[i+1]);
        }
    }
    cout<<ans<<"\n";
    return 0;
}

E/F

待补.

G/H

直接给 $a_1,a_2,a_3$ 赋值,总计有 $3^3=27$ 种可能,枚举每种组合,判断是否符合所有的约束条件即可.

当然你也可以像官方题解那样整一个大分类讨论(我考场上写这玩意吃了好几发罚时2333).

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int t,n;
int x[100],y[100],z[100],a[4][30],cnt;
bool cmp(int u,int v) {
    return u < v;
}
bool check() {
    for(int i=1;i<=cnt;i++) {
        bool flag=true;
        for(int j=1;j<=n;j++) {
            if(cmp(a[x[j]][i],a[y[j]][i]) != z[j]) {
                flag=false;
                break;
            }
        }
        if(flag) return true;
    }
    return false;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>t;
    for(int i=1;i<=3;i++) 
    for(int j=1;j<=3;j++) 
    for(int k=1;k<=3;k++) a[1][++cnt]=i,a[2][cnt]=j,a[3][cnt]=k;
    while(t--) {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>x[i]>>y[i]>>z[i];
        if(check()) cout<<"YEs\n";  
        else cout<<"No\n";
    }
    return 0;
}

I

幽默数学题,不会开摆

J

分别计算每个人对期望的贡献,考虑到直接计算需要容斥,我们选择反向计算每个人不会被选中的概率.以男嘉宾为例,有公式 $\sum_{i=1}^n(1-\prod_{e(i,j)}(1-d\,\lbrack j\rbrack\,)\,)$,其中 $e(i,j)$ 表示 $i$ 与 $j$ 有边相连.

(官方题解里这题的公式写错了)

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=2e5+10;
int x[N],y[N],d1[N],d2[N];
int n,m,k;
double ans1[N],ans2[N],sum1,sum2;
void solve() {
    for(int i=1;i<=n;i++) ans1[i]=1;
    for(int i=1;i<=m;i++) ans2[i]=1;
    for(int i=1;i<=k;i++) {
        int u=x[i],v=y[i];
        if(d2[v]) ans1[u]*=(1.0-1.0/d2[v]);
        if(d1[u]) ans2[v]*=(1.0-1.0/d1[u]);
    }
    for(int i=1;i<=n;i++) sum1+=1.0-ans1[i];
    for(int i=1;i<=m;i++) sum2+=1.0-ans2[i];
    cout<<"float\n";
    cout<<fixed<<setprecision(10)<<sum1<<" "<<sum2<<"\n";
    return;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++) {
        cin>>x[i]>>y[i];
        d1[x[i]]++; d2[y[i]]++;
    }
    solve();
    return 0;
}

K

L/M

设 $k_i$ 为 $a_i$ 在十进制下的位数,题目即让我们求满足 $a_j*10^{k_i} \, mod \, 36 + a_i \,mod \, 36 =36$ 的二元组 $(i,j)$ 的数量.我们枚举 $a_i$ ,对于 $a_j$ ,因为我们只关心它模 $36$后的值,所以并不需要一一枚举,只需要预处理出每一个余数对应的数的个数,计算答案时统一加上即可,复杂度 $O(36n)$.

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define int long long
const int N=2e5+10;
LL a[N],k[N],num[40],ans,b[30];
int n;
void solve() {
    b[1]=10;
    for(int i=2;i<=22;i++) b[i]=b[i-1]*10%36;
    for(int i=1;i<=n;i++) {
        for(int j=0;j<36;j++) {
            int tmp=j*b[k[i]]%36 + a[i]%36;
            if(tmp == 36 || tmp == 0) {
                ans+=num[j];
                if(a[i]%36 == j) ans--;
            }
        }
    }
    cout<<ans<<"\n";
    return;
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
        num[a[i]%36ll]++;
        int tmp=a[i],js=0;
        while(tmp) {
            tmp/=10ll;
            js++;
        }
        k[i]=js;
    }
    solve();
    return 0;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇