AtCoder Beginner Contest 189

AtCoder Beginner Contest 189

A - Slot

#include <bits/stdc++.h>

//#pragma GCC optimize(2)
#define int long long
using namespace std;
//const int mod = 998244353;
const int mod = 1e9 + 7;
const int maxn = 1e3 + 10;

int a[maxn];

void solve() {
    
    
    /*int n;
    cin>>n;*/
    string a;
    cin>>a;
    if (a[0]==a[1]&&a[0]==a[2]) cout<<"Won";
    else cout<<"Lost";

}

signed main() {
    
    
//    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
//    cin >> _;
    while (_--) {
    
    
        solve();
    }
    return 0;
}



B - Alcoholic

注意精度问题

#include <bits/stdc++.h>

//#pragma GCC optimize(2)
#define int long long
using namespace std;
//const int mod = 998244353;
const int mod = 1e9 + 7;
const int maxn = 1e3 + 10;

int v[maxn];
int p[maxn];

void solve() {
    
    
    int n;
    int x;
    cin>>n>>x;
    x*=100;
    for (int i = 0; i < n; ++i) {
    
    
        cin>>v[i]>>p[i];
    }
    for (int i = 0; i < n; ++i) {
    
    
        x-=v[i]*p[i];
        if (x<0) {
    
    
            cout<<i+1;
            return;
        }
    }
    cout<<-1;
}

signed main() {
    
    
//    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
//    cin >> _;
    while (_--) {
    
    
        solve();
    }
    return 0;
}



C - Mandarin Orange

令X=a[i],往俩边找不满足条件的,计算长度,答案ans=x*l。
遍历一遍,记录最大值即可。

#include <bits/stdc++.h>

//#pragma GCC optimize(2)
#define int long long
using namespace std;
//const int mod = 998244353;
const int mod = 1e9 + 7;
const int maxn = 1e4 + 10;

int a[maxn];

void solve() {
    
    
    int n;
    cin>>n;
    for (int i = 0; i < n; ++i) {
    
    
        cin>>a[i];
    }
    int max_=0;
    for (int j = 0; j < n; ++j) {
    
    
        int x=a[j];
        int l=0;
        for (int i = j; i < n; ++i) {
    
    
            if (a[i]<x) break;
            l++;
        }
        for (int k = j-1; k>=0; --k) {
    
    
            if (a[k]<x) break;
            l++;
        }
        max_=max(max_,l*x);
    }
    cout<<max_;
}

signed main() {
    
    
//    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
//    cin >> _;
    while (_--) {
    
    
        solve();
    }
    return 0;
}



D - Logical Expression

线性dp
dp[i][0/1]=>第i个位置为0/1的种数

#include <bits/stdc++.h>

//#pragma GCC optimize(2)
#define int long long
using namespace std;
//const int mod = 998244353;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 10;

int dp[100][2];
string s[100];

void solve() {
    
    
    int n;
    cin>>n;
    for (int i = 1; i <=n; ++i) {
    
    
        cin>>s[i];
    }
    dp[0][0]=dp[0][1]=1;
    for (int i = 1; i <=n; ++i) {
    
    
        if(s[i][0]=='A'){
    
    
            dp[i][1]=dp[i-1][1];
            dp[i][0]=dp[i-1][0]*2+dp[i-1][1];
        } else{
    
    
            dp[i][0]=dp[i-1][0];
            dp[i][1]=dp[i-1][1]*2+dp[i-1][0];
        }
    }
    cout<<dp[n][1];
}

signed main() {
    
    
//    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
//    cin >> _;
    while (_--) {
    
    
        solve();
    }
    return 0;
}

E - Rotate and Flip

硬模拟操作,变成一个公式,后面查询代入点计算即可

#include <bits/stdc++.h>
using namespace std;
long long a[200001],b[200001],s1[200001],s2[200001];
bool sw[200001];
pair<int,int> pts[200001];
int main(){
    
    
    int n;
    scanf("%d",&n);
    for (int i=0;i<n;++i){
    
    
        int x,y;
        scanf("%d%d",&x,&y);
        pts[i]={
    
    x,y};
    }
    int m;
    scanf("%d",&m);
    s1[0]=s2[0]=1;
    for (int i=1;i<=m;++i){
    
    
        int op;
        scanf("%d",&op);
        if (op==1){
    
    
            a[i]=b[i-1];
            b[i]=-a[i-1];
            s1[i]=s2[i-1];
            s2[i]=-s1[i-1];
            sw[i]=!sw[i-1];
        } else if (op==2) {
    
    
            a[i]=-b[i-1];
            b[i]=a[i-1];
            s1[i]=-s2[i-1];
            s2[i]=s1[i-1];
            sw[i]=!sw[i-1];
        } else if (op==3){
    
    
            int p;
            scanf("%d",&p);
            a[i]=2*p-a[i-1];
            s1[i]=-s1[i-1];
            b[i]=b[i-1];
            s2[i]=s2[i-1];
            sw[i]=sw[i-1];
        } else {
    
    
            int p;
            scanf("%d",&p);
            a[i]=a[i-1];
            s1[i]=s1[i-1];
            b[i]=2*p-b[i-1];
            s2[i]=-s2[i-1];
            sw[i]=sw[i-1];
        }
    }

    int q;
    scanf("%d",&q);
    while (q--){
    
    
        int x,y,i,j;
        scanf("%d%d",&i,&j);
        --j;
        x=pts[j].first;
        y=pts[j].second;
        if (sw[i]) swap(x,y);
        printf("%lld %lld\n",a[i]+s1[i]*x,b[i]+s2[i]*y);
    }
}

F - Sugoroku2

期望dp,dp[i][1]表示i到n的期望步数,dp[i][0]=1表示i点会回到0的可能,就是方程中的a。
dp[i][1]=(dp[i+1][1]+dp[i+2][1]…dp[i+m][1])/m+1/m*m
最后解个方程x=a∗x+b,x=dp[0][1]

#include <bits/stdc++.h>

//#pragma GCC optimize(2)
#define int long long
using namespace std;
//const int mod = 998244353;
const int mod = 1e9 + 7;
const int maxn = 2e5 + 10;

int vis[maxn];
double dp[maxn][2];

void solve() {
    
    
    int n, m, k,a;
    cin >> n >> m >> k;
    for (int i = 0; i < k; ++i)
        cin >> a,vis[a] = 1;
    double sum = 0, res = 0;
    for (int i = n - 1; i >= 0; --i) {
    
    
        if (vis[i]) dp[i][0] = 1.0;
        else {
    
    
            dp[i][1] = sum / m + 1;
            dp[i][0] = res / m;
        }
        sum += dp[i][1] - dp[i + m][1];
        res += dp[i][0] - dp[i + m][0];
    }
    if (abs(dp[0][0] - 1.0) < 1e-8) cout << -1;
    else printf("%.4lf\n", dp[0][1] / (1 - dp[0][0]));
}

signed main() {
    
    
//    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int _ = 1;
//    cin >> _;
    while (_--) {
    
    
        solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45436102/article/details/113106716