每日练习4

这两天状态不太好,写的比较少

8.15

牛客

a.签到题

英雄联盟的投降机制,模拟

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin >> s;
    int sum1=0,sum2=0;
    for(auto c:s) {
        if(c=='-') break;
        if(c=='Y') sum1++;
        if(c=='N') sum2++;
    }
    if(sum1>=4) cout << 1 << endl;
    else if(sum2>=2) cout << -1 << endl;
    else cout << 0 << endl;
    return 0;
}

h.概率推结论

#include <iostream>
using namespace std;
#define int long long
const int mod = 998244353;
int a, b, tot;
int qmi(int a, int k, int p)
{
    int res = 1;
    while (k)
    {
        if (k & 1)
            res = res * a % p;
        a = a * a % p, k >>= 1;
    }
    return res;
}
signed main()
{
    cin >> a >> b, tot = a + b;
    cout << (a * qmi(tot, mod - 2, mod)) % mod << " " << (b * qmi(tot, mod - 2, mod)) % mod << endl;
}

2.round898 div4 2(写牛客写的道心破碎来放松)

A.Short Sort

虽然送但是还是写太久了,题目给定abc三字母只是乱序,我选择的是先看多少个不在位置上的字母如果0正确,如果二再单独判断交换后是否相等abc。其实实际上只需要判断不在位置上的是不是小于2就行了。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--) {
        string s;
        cin >> s;
        string t="abc";
        int wcnt=0;
        vector<int> W;
        for(int i=0;i<s.size();i++) {
            if(s[i]!=t[i]) 
            {
                wcnt++;
                W.push_back(i);
            }
        }
        bool flag=false;
        if(W.size()==2) {
            int tt=s[W[0]];
            s[W[0]]=s[W[1]];
            s[W[1]]=tt;
            if(s==t) {
                flag=true;
            }
        }
        if(W.size()==0) {
            flag=true;
        }
        if(flag) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
}

B.Good Kid

给越小的数加大,得到的乘积越大(相当于乘以分数的大小更大)

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        vector<int> A(n);
        for(int i=0;i<n;i++) {
            cin >> A[i];
        }
        sort(A.begin(),A.end());
        long long sum=1;
        for(int i=0;i<n;i++) {
            if(i==0) {
                sum*=(A[i]+1);
            }else {
                sum*=A[i];
            }
        }
        cout << sum << endl;
    }
}

C.Target Practice

我直接暴力判断的,但是码力还是比较差码了挺久。

#include <bits/stdc++.h>
using namespace std;
string S[10];
bool st[15][15];
int main()
{
    int t;
    cin >> t;
    while(t--) {
        memset(st,0,sizeof st);
        for(int i=0;i<10;i++) {
            cin >> S[i];
        }
        int sum=0;
        for(int f=0;f<5;f++) {
            for(int i=0;i<10;i++) {
                for(int j=0;j<10;j++) {
                    if(i==f || i==9-f || j==f || j==9-f) 
                    {
                        if(S[i][j]=='X' && !st[i][j]) {
                            st[i][j]=true;
                            sum+=f+1;
                        }
                    }
                }
            }
        }
        cout << sum << endl;
    }
}

D.1D Eraser

贪心变白,从左到右

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--) {
        int n,k;
        cin >> n >> k;
        string S;
        cin >> S;
        int l=0;
        int sum=0;
        while(l<S.size()) {
            // cout << "l:" << l << " S[l]:" << S[l] << endl;
            if(S[l]=='B') {
                sum++;
                for(int i=l;i<S.size() && i<l+k;i++) {
                    S[i]='W';
                }
                l+=k;
            }else {
                l++;
            }
        }
        cout << sum << endl;
    }
}

E.Building an Aquarium

裸二分,但是因为数据范围是2e9,然后check里面有一个加法导致我如果写一个r=1e16爆了挺多次。

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,x;
const int N=2e5+10;
int A[N];
bool check(int u) {
    long long sum=0;
    for(int i=0;i<n;i++) {
        if(A[i]<u) {
            sum+=(u-A[i]);
        }
    }
    if(sum<=x) return true;
    else return false;
}
signed main()
{
    int t;
    cin >> t;
    while(t--) {
        cin >> n >> x;
        for(int i=0;i<n;i++) {
            cin >> A[i];
        }

        int l=1,r=1e13;
        while(l<r) {
            int mid=(l+r+1)>>1;
            if(check(mid)) l=mid;
            else r=mid-1;
        }
        cout << l << endl;
    }
}

F.Money Tree

看起来就模拟,写了个queue模拟过样例wa了七八次,又道心破碎,1300的div4题目写不出来,双指针一看好像一目了然,待补充。

G,H 待补

3.div3 13

CF 762

A.字符是否是“平方”,分类讨论模拟

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--) {
        string s;
        cin >> s;

        if(s.size()<2) {
            cout << "NO" << endl;
            continue;
        }else {
            if(s.size()%2) {
                cout << "NO" << endl;
                continue;
            }else {
                int mid=s.size()/2;
                if(s.substr(0,mid)==s.substr(mid,mid)) {
                    cout << "YES" << endl;
                }else {
                    cout << "NO" << endl;
                }
            }
        }
    }
}

B.想了很久怎么保证不重复而且空间复杂度ok,最后用的map,但是实际上set就行了

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--) {
        unordered_map<int,int> Hash;
        int n;
        cin >> n;
        int sum=0;
        for(int i=1;i*i<=n;i++) {
            Hash[i*i]++;
            sum++;
        }
        for(int i=1;i*i*i<=n;i++) {
            if(Hash.count(i*i*i)==0) sum++;
        }
        cout << sum << endl;
    }
}

C.题目比较清晰,就是一个逆向右往左一个个减,处理一下细节就好

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--) {
        string ans="";
        string a,b;
        cin >> a >> b;
        int r=b.size()-1;
        bool flag=true;
        for(int l=a.size()-1;l>=0;l--) {
            if(a[l]<=b[r]) {
                // cout << "b:" << b[r] << " l:" << a[l] << endl;
                ans+=(char)(b[r]-a[l]+'0');
                r--;
                // cout << "ans:" << ans << endl;
            }else {
                if(b[r-1]!='1') {
                    flag=false;
                    break;
                }else {
                    int t=10+(b[r]-a[l]);
                    // cout << "t:" << t << endl;
                    ans+=(char)(t+'0');
                    // cout << "ans:" << ans << endl;
                }
                r-=2;
            }
        }
        // cout << r << endl;
        // cout << "ans:" << ans << endl;
        if(r!=-1) {
            for(int i=r;i>=0;i--) {
                ans+=b[i];
                // cout << b[i] << endl;
            }
        }
        // cout << "ans:" << ans << endl;
        int pos=ans.size();
        for(int i=ans.size()-1;i>=0;i--) {
            if(ans[i]=='0') {
                pos--;
            }else {
                break;
            }
        }
        if(!flag) cout << -1 << endl;
        else {
            for(int i=pos-1;i>=0;i--) {
                cout << ans[i];
            }
            cout << endl;
        }
    }
}

D.二分,然后比较新的是用二维维克托动态存防止内存爆,还有怎么check需要仔细思考,m-1个商店,那么必须有一个商店满足两个人,并且每个人都有商店可以满足就成功。

#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<vector<int>> room;
bool check(int u) {
    vector<bool> st(m);
    bool flag=false;
    for(int i=0;i<n;i++) {
        int cnt=0;
        for(int j=0;j<m;j++) {
            if(room[i][j]>=u) {
                st[j]=true;
                cnt++;
            }
        }
        if(cnt>=2) flag=true;
    }
    if(!flag || m==1) return false;

    bool flag2=false;
    for(int i=0;i<m;i++) {
        if(!st[i]) flag2=true;
    }
    if(!flag2) return true;
    return false;
}
int main()
{
    int t;
    cin >> t;
    while(t--) {
        cin >> n >> m;
        // cout << "n:" << n << m << endl;
        room.assign(n,vector<int>(m));
        for(int i=0;i<n;i++) {
            for(int j=0;j<m;j++) {
                cin >> room[i][j];
                // cout << room[i][j];
            }
            // cout << endl;
        } 
        int l=1,r=1e9;
        while(l<r) {
            int mid=(l+r+1)>>1;
            if(check(mid)) l=mid;
            else r=mid-1;
        }
        cout << l << endl;
    }
    return 0;
}

E.

8.16

Codeforces Round 744 (Div. 3)

A.计数模拟

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--) {
        string s;
        cin >> s;
        if(s.size()%2) {
            cout << "NO" << endl;
            continue;
        }else {
            int sum1=0,sum2=0,sum3=0;
            for(auto c:s) {
                if(c=='A') sum1++;
                if(c=='B') sum2++;
                if(c=='C') sum3++;
            }
            // cout << "sum:" << sum1 << " " << sum2 << " " << sum3 << endl;
            if(sum2==sum1+sum3) cout << "YES\n";
            else cout << "NO\n";
        }
    }
}

B.选择排序模拟,但是我写的更暴力。。补一下官方题解

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        vector<int> A(n),B(n);
        for(int i=0;i<n;i++) {
            cin >> A[i];
            B[i]=A[i];
        }
        sort(A.begin(),A.end());
        // for(int i=0;i<n;i++) {
        //     cout << A[i] << endl;
        // }
        // cout << "first\n";
        // for(int i=0;i<n;i++) {
        //     cout << B[i] << " ";
        // }
        // cout << endl;

        vector<int> ans;
        int sum=0;
        for(int i=0;i<n;i++) {
            int t=A[i];
            if(B[i]!=t) {
                for(int j=i;j<n;j++) {
                    if(B[j]==t) {
                        int t=B[j];
                        for(int z=j;z>=i+1;z--) {
                            B[z]=B[z-1];
                        }               
                        B[i]=t;      
                        //  for(int i=0;i<n;i++) {
                        //      cout << B[i] << " ";
                        // }
                        // cout << endl;
                        // cout << i+1 << " " << j+1 << " " << j-i << endl;
                        sum++;
                        ans.push_back(i+1);
                        ans.push_back(j+1);
                        ans.push_back(j-i);
                    }
                }
            }
        }

        cout << sum << endl;
        for(int i=0;i<ans.size();i+=3) {
            cout << ans[i] << " " << ans[i+1] << " " << ans[i+2] << endl;
        }
    }
}

C.模拟题,从右下角找符合规则的是否能被染黑

#include <bits/stdc++.h>
using namespace std;
const int N=25;
string room[N];
bool st[N][N];
int n,m,k;
bool check(int x,int y) {
    if(x<n && x>=0 && y<m && y>=0) {
        return true;
    }
    return false;
}
int main()
{
    int t;
    cin >> t;
    while(t--) {
        memset(st,0,sizeof st);
        cin >> n >> m >> k;
        for(int i=0;i<n;i++) {
            cin >> room[i];
        }
        for(int i=n-1;i>=0;i--) {
            for(int j=m-1;j>=0;j--) {
                if(room[i][j]=='*') {
                    bool flag=false;
                    for(int t=k;t<=10;t++) {
                        bool fflag=true;
                        for(int z=1;z<=t;z++) {
                            if(check(i-z,j-z) && check(i-z,j+z)) 
                            {
                                if(room[i-z][j-z]=='*' && room[i-z][j+z]=='*') {
                                    
                                }else {
                                    fflag=false;
                                    break;
                                }
                            }else {
                                fflag=false;
                                break;
                            }
                        }
                        if(fflag)
                        {
                            for(int z=1;z<=t;z++) {
                                if(check(i-z,j-z) && check(i-z,j+z)) 
                                {
                                    st[i-z][j-z]=st[i-z][j+z]=true;
                                    flag=true;
                                }
                            }
                        }
                    }
                    
                    if(flag) st[i][j]=true;
                }
            }
        }
        bool flag=false;
        for(int i=0;i<n;i++) {
            for(int j=0;j<m;j++) {


                if(!st[i][j] && room[i][j]=='*') {
                    flag=true;
                }
            }


        }
        if(!flag) {
            cout << "YES" << endl;
        }else {
            cout << "NO" << endl;
        }
    }
}

D.

E.

F.

明天主要是补题,感觉写的题已经挺多了,除了数学其他1200以下的题目基本是一眼,1200以上1600以下的的div3要么是数学要么是模拟,模拟我一般都能时间堆出来,但是数学题我真的很烂,补完题后板刷一下数学的题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值