《看了受制了》第二十五天吗,5道题,合计119道题

发布时间 2023-09-24 23:18:56作者: wxzcch

2023年9月24日

今天下午,把atcoder翻译的弄成了一个ChatGpt的接口版本。优化了很多。

牛客周赛13 矩阵转置置

题面理解

就是语法,倒着输出即可。

代码实现

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;

const int Mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;

ll qmi(ll a, ll b){
    ll res = 1;
    while(b)
    {
        if(b & 1) res = res * a % Mod;
        a = a * a % Mod;
        b >>= 1;
    }
    return res;
}

ll inv(ll x){ return qmi(x, Mod - 2);}
ll mo(ll x){ return (x % Mod + Mod) % Mod;}

const int N = 110;
int a[N][N];

int main() {

    int n;
    cin >> n;

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            cin >> a[i][j];

    
    for(int i = n; i >= 1; i--)
    {
        for(int j = n; j >= 1; j--)
            cout << a[i][j] << " ";
        
        cout << endl;
    }

    return 0;
}

牛客周赛13 小红买基金

题面理解

假设有k张卡,是符合范围的那么,这k张卡都有买和不买两种选择。所以就是2^k

代码实现

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;

const int Mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;

ll qmi(ll a, ll b){
    ll res = 1;
    while(b)
    {
        if(b & 1) res = res * a % Mod;
        a = a * a % Mod;
        b >>= 1;
    }
    return res;
}

const int N = 200000 + 10;


ll inv(ll x){ return qmi(x, Mod - 2);}
ll mo(ll x){ return (x % Mod + Mod) % Mod;}

ll C8(int n, int m)
{
    if (n == m || m == 0) return 1;
    return C8(n, m-1) * (n-m+1) / m;
}




ll n, a, b;

int main() {

    cin >> n >> a >> b;

    ll res = 1;

    for(int i = 1; i <= n; i++)
    {
        int p, q;
        cin >> p >> q;

        if(p >= a && q <= b)
            res = mo(res * 2);
        res = mo(res);
    }


    cout << res - 1;
    return 0;
}

牛客周赛13 小红改密码

题面理解

  • 替换大写字母:在密码中所有的大写字母位置上,可以替换为其他任意一个大写字母(除原字母外)。共有26种可能性。

  • 替换小写字母:在密码中所有的小写字母位置上,可以替换为其他任意一个小写字母(除原字母外)。共有26种可能性。*

  • 替换数字:在密码中所有的数字位置上,可以替换为其他任意一个数字(除原数字外)。共有10种可能性。

  • 替换特殊符号:在密码中所有的特殊符号位置上,可以替换为其他任意一个特殊符号(除原符号外)。共有4种可能性。

  • 如果那个字母只出现了一次,那只能替换出他自己以外的同种类的,如一个小字母,那么那个小写字母只能替换25个

代码实现

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;

const int Mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;

ll qmi(ll a, ll b){
    ll res = 1;
    while(b)
    {
        if(b & 1) res = res * a % Mod;
        a = a * a % Mod;
        b >>= 1;
    }
    return res;
}

const int N = 200000 + 10;


ll inv(ll x){ return qmi(x, Mod - 2);}
ll mo(ll x){ return (x % Mod + Mod) % Mod;}

int n;


int main() {

    int all = 26 + 26 + 10 + 4 - 1;
    cin >> n;
    while(n--)
    {
        string s;
        cin >> s;

        int num = 0, en = 0, EN = 0, oth = 0;

        for(int i = 0; i < s.size(); i++)
        {
            if(s[i] >= '0' && s[i] <= '9') num++;
            else if(s[i] >= 'A' && s[i] <= 'Z') EN++;
            else if(s[i] >= 'a' && s[i] <= 'z') en++;
            else if(s[i] == '!' || s[i] == '?' || s[i] == ',' || s[i] == '.') oth++;
        }

        int res = 0;
        if(num > 1)
            res += num * all;
        else
            res += 9;
        
        if(EN > 1)
            res += EN * all;
        else
            res += 25;
        
        if(en > 1)
            res += en * all;
        else
            res += 25;

        if(oth > 1)
            res += oth * all;
        else
            res += 3;

        cout << res << endl;
    }
    return 0;
}

Acwing1912 历程表

题面理解

这个题面直接枚举所有符合规则的数即可。范围很小,然后学到了stoll、stio,以及创建长度为n都是x组成的字符串string s(n, x)

代码实现

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;

const int Mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;

ll qmi(ll a, ll b){
    ll res = 1;
    while(b)
    {
        if(b & 1) res = res * a % Mod;
        a = a * a % Mod;
        b >>= 1;
    }
    return res;
}

ll inv(ll x){ return qmi(x, Mod - 2);}
ll mo(ll x){ return (x % Mod + Mod) % Mod;}


int main() {
    ll a, b;
    cin >> a >> b;
    int res = 0;
    for(int i = 3;  i <= 17; i++)
        for(int j = 0; j < 10; j++)
            for(int k = 0; k < 10; k++)
                if(j != k)
                    for(int u = 0; u < i; u++)
                    {
                        string s(i, '0' + j);
                        s[u] = '0' + k;
                        if(s[0] != '0')
                        {
                            ll v = stoll(s);

                            if(v >= a && v <= b)
                                res++;
                        }
                    }

    cout << res;
    return 0;
}

Acwing2003 找到牛

题面理解

我是用的最最最暴力的枚举。。。哎
优化枚举:

  • 记录前面有多少条前腿
  • 遇到后退就加上,前面有多少个前腿
  • 因为我们是从左往右枚举,所以遇到的后退,一定是能和前面的腿组合的!!!!!哎纯笨蛋了这个。

代码实现

笨蛋枚举

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;

const int Mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;

ll qmi(ll a, ll b){
    ll res = 1;
    while(b)
    {
        if(b & 1) res = res * a % Mod;
        a = a * a % Mod;
        b >>= 1;
    }
    return res;
}

ll inv(ll x){ return qmi(x, Mod - 2);}
ll mo(ll x){ return (x % Mod + Mod) % Mod;}


int main() {

    string s;
    cin >> s;

    int l = 0, r = 0;

    int res = 0;
    vector<int> posl, posr;
    for(int i = 0; i < s.size() - 1; i++)
        if(s[i] == s[i + 1] && s[i] == '(')
            posl.push_back(i);
    for(int i = 0; i < s.size() - 1; i++)
        if(s[i] == s[i + 1] && s[i] == ')')
            posr.push_back(i);
    
    

    for(int i = 0 ; i < posl.size(); i++)
    {
        
        for(int j = 0; j < posr.size(); j++)
        {
            if(posl[i] < posr[j])
            {
                res += posr.size() - j;
                break;
            }
        }
    }
    cout << res;
    return 0;
}

聪明蛋枚举

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

string str;

int main()
{
    cin >> str;

    int res = 0;
    for (int i = 1, s = 0; i < str.size(); i ++ )
    {
        if (str[i] == '(' && str[i - 1] == '(') s ++ ;
        else if (str[i] == ')' && str[i - 1] == ')') res += s;
    }

    cout << res << endl;
    return 0;
}