SDUT 2023 summer team contest(for 22) - 7

A - JB Loves Math

三道签到题一人一个 就我做的a题wa了七发😭

做题真的不能急,这么一道签到题wa了七发,真的是很无语了,但确实一开始考虑少情况了 所以说有的时候自己脑子想不清楚的时候,还是在纸上写一下比较好

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define xx first
#define yy second
typedef pair<int, int> PII;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 10;

int v[N], n, m, k, x, t, T;

void ClearFloat()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
}

signed main()
{
    ClearFloat();
    cin >> T;
    while (T--)
    {
        int a, b;
        cin >> a >> b;
        if (a < b)
        {
            if ((b - a) % 2 != 0)
                cout << "1\n";
            else if (((b - a) / 2) % 2 == 1)
                cout
                    << "2\n";
            else if (((b - a) / 2) % 2 == 0)
                cout << "3\n";
        }
        else if (a > b)
        {
            if ((a - b) % 2 == 0)
                cout << "1\n";
            else
                cout << "2\n";
        }
        else if (a == b)
            cout << "0\n";
    }
    return 0;
}

B - JB Loves Comma

这个图片就是我的心情

 也是一道签到题 就是把“cjb”换成"cjb,"

#include <bits/stdc++.h>

using namespace std;

int main()
{
    string s;
    cin>>s;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='c'&&s[i+1]=='j'&&s[i+2]=='b')
        {
            cout<<"cjb,";
            i+=2;
        }
        else cout<<s[i];
    }
    return 0;
}

C - JB Wants to Earn Big Money

 

 签到

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
#define int long long
typedef pair<int, int>PII;
int n, m, k;
int T;

signed main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    int ans = 0;
    cin >> n >> m >> k;
    for(int i = 0; i < n; i ++)
    {
        int x;
        cin >> x;
        if(x>=k) ans++;
    }
    for(int i = 0; i < m; i ++)
    {
        int x;
        cin >> x;
        if(x<=k) ans++;
    }
    cout << ans;
}

G - Easy Glide

 多做题还是很有用的!!!队友集训第一个周做了洛谷的最短路,终于让他遇到了,直接拿了一血一发过,也让我队训练赛第一次拿到了第一体验卡,qhhyyds。

这道题用头插法注意N要开2e6,因为无向图要开双倍,不然你就会第64个点wa半天还不知道哪里错的(不要问我咋知道是Wrong answer on test 64的)

队友用vector做的也放在下面了

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define xx first
#define yy second
typedef pair<double, int> PII;
const int INF = 0x3f3f3f3f;
const int N = 2e6 + 10;

int v[N], n, m, k, x, t, T;
int e[N], ne[N], h[N], idx;
int a[N], b[N];
double dis[N], w[N];
bool vis[N];

void add(int a, int b, double c)
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}
void dijkstra()
{
    dis[0] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, 0});
    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();
        int u = t.yy;
        if (vis[u])
            continue;
        vis[u] = 1;
        for (int i = h[u]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dis[j] > dis[u] + w[i])
            {
                dis[j] = dis[u] + w[i];
                heap.push({dis[j], j});
                // cout << dis[j] << endl;
            }
        }
    }
    printf("%.12f", dis[n + 1]);
}

signed main()
{
    memset(h, -1, sizeof h);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i] >> b[i];
    int s1, s2, t1, t2;
    cin >> s1 >> s2 >> t1 >> t2;
    a[0] = s1, a[n + 1] = t1, b[0] = s2, b[n + 1] = t2;
    int v1, v2;
    cin >> v1 >> v2;
    for (int i = 0; i <= n + 1; i++)
        dis[i] = 0x3f3f3f3f;
    for (int i = 0; i <= n + 1; i++)
    {
        for (int j = i + 1; j <= n + 1; j++)
        {
            double s = sqrt((a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) * (b[i] - b[j]));
            // cout << s << endl;
            if (i == 0)
            {
                double t = s / v1;
                add(i, j, t);
            }
            else
            {
                double t = 0;
                double ss = 3 * v2;
                if (ss >= s)
                    t = s / v2;
                else
                    t = 3.0 + (s - ss) / v1;
                add(i, j, t);
                if (j != n + 1)
                    add(j, i, t);
            }
        }
    }
    dijkstra();
    return 0;
}

这个N开1e6就可以了 

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
#define int long long
typedef pair<double, int>PII;
int n, m, k;
int T;
int a[N], b[N];
double dis[N];
bool st[N];
int cnt = 0;
vector<pair<int, double>>v[N];
priority_queue<PII, vector<PII>, greater<PII>>q;

void dijkstra()
{
    dis[0] = 0;
    q.push({0, 0});
    while(q.size())
    {
        PII k = q.top();
        q.pop();
        double k1 = k.first;
        int k2 = k.second;
        if(st[k2]) continue;
        st[k2] = true;
        for(int i = 0; i < v[k2].size(); i ++)
        {
            int z = v[k2][i].first;
            if(dis[z] > dis[k2] + v[k2][i].second)
            {
                dis[z] = dis[k2] + v[k2][i].second;
                q.push({dis[z], z});
            }
        }
    }
}

signed main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++)
    {
        cin >> a[i] >> b[i];
    }
    int s1, s2, t1, t2;
    cin >> s1 >> s2 >> t1 >> t2;
    a[0] = s1, b[0] = s2, a[n+1] = t1, b[n+1] = t2;
    int v1, v2;
    cin >> v1 >> v2;
    for(int i = 0; i <= n+1; i ++) dis[i] = 0x3f3f3f3f;
    for(int i = 0; i <= n+1; i ++)
    {
        for(int j = i + 1; j <= n+1; j ++)
        {
            double s = sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]));
            if(i == 0)
            {
                double t = s/v1;
                v[i].push_back({j, t});
            }
            else
            {
                double t = 0;
                double ss = 3*v2;
                if(ss >= s) t = s/v2;
                else t = 3.0+(s-ss)/v1;
                v[i].push_back({j, t});
                if(j!=n+1) v[j].push_back({i, t});
            }
        }
    }
    dijkstra();
    printf("%.12lf", dis[n+1]);
    return 0;
}

L - Candy Machine

这道题一开始没啥思路,本来觉得是从前面那一个,然后在一直从后面拿数,直到平均数大于后面的数再从前面那一个,重复操作,队友很快举出了「1 2 3 4 100」的反例。

突然qhh的灵光一现想到了应该就是从头开始拿,因为如果不拿最小的数的话,找到这种情况下的最优解之后,再在子集中加入这个最小数,最优解不受影响甚至成为更优解。

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define xx first
#define yy second
typedef pair<int, int> PII;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 10;

int v[N], n, m, k, x, t, T;

void ClearFloat()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
}
set<int> s;
signed main()
{
    ClearFloat();
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> v[i];
    int sum = 0, ans = 0, ava;
    sort(v + 1, v + 1 + n);
    for (int i = 1; i <= n; i++)
    {
        sum += v[i];
        ava = sum / i;
        int r = i - (upper_bound(v + 1, v + 1 + i, ava) - v) + 1;
        // cout<<"--- " << i << " " << (upper_bound(v + 1, v + 1 + i, ava) - v) << endl;
        // cout << i << " " << r << endl;
        ans = max(ans, r);
    }
    cout << ans << endl;
    return 0;
}

M - BpbBppbpBB

 这道题本来觉得会是纯暴力打表,打表之王qhh看到有10种排列方式就不想做了,最后是搜了一下题解,这道题可以根据黑色的方块数和黑色夹着的中间白色的方块数列一个二元一次方程组,然后就就可以求解了。

学到了vector<string>怎么用来打表

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
#define int long long
typedef pair<int, int>PII;
int n, m, k;
int T;
char g[1010][1010];
string s[10], c[10];

void build()
{
    c[0] = "######";
    c[1] = "##..##";
    c[2] = "#....#";
    c[3] = "#....#";
    c[4] = "##..##";
    c[5] = "######";
}

bool check(int x, int y)
{
    int cnt = 0;
    for(int i = 1+x; i <= 6+x; i ++)
    {
        s[cnt] = "";
        for(int j = 1+y; j <= 6+y; j ++)
        {
            s[cnt]+=g[i][j];
        }
        if(s[cnt]!=c[cnt]) return 0;
        cnt++;
    }
    return 1;
}

signed main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n >> m;
    int hei = 0;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            cin >> g[i][j];
            if(g[i][j]=='#') hei++;
        }
    }
    build();
    int bai = 0;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            if(g[i][j]=='#')
            {
                if(check(i-1, j-1)) bai++;
            }
        }
    }
    int x, y;
    int a = 146, b = 100;
    x = (bai*b-hei)/(2*b-a);
    y = bai - 2*x;
    cout << x << " " << y;
    return 0;
}

I题还没有补 下次一定




今天不学习 明天变垃圾

I - Barbecue

学了一上午的字符串哈希,希望我能多记住几天

假如一开始截取的就是回文串,那么Budada就直接赢了(第二组样例)

else //谁拿到最后两个字母 谁就输了->谁手里是奇数个字符谁就赢了

        一开始截取的字符串长度是奇数个-> Putata赢

        一开始截取的字符串长度是偶数个->Budada赢

#include <bits/stdc++.h>
using namespace std;

#define int long long
#define xx first
#define yy second
typedef pair<int, int> PII;
typedef unsigned long long ULL;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 10;
const int P = 131;
int v[N], n, m, k, x, t, T, q;
ULL p[N], h[N], hh[N];
char s[N];
void ClearFloat()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
}
ULL gets1(int l, int r)
{
    return h[r] - h[l - 1] * p[r - l + 1];
}
ULL gets2(int l, int r)
{
    return hh[l] - hh[r + 1] * p[r - l + 1];
}
signed main()
{
    ClearFloat();
    cin >> n >> q >> (s + 1);
    p[0] = 1;
    for (int i = 1; i <= n; i++)
    {
        h[i] = h[i - 1] * P + s[i];
        hh[n + 1 - i] = hh[n + 1 - i + 1] * P + s[n + 1 - i];
        p[i] = p[i - 1] * P;
    }
    for (int i = 1; i <= q; i++)
    {
        int l, r;
        cin >> l >> r;
        if (gets1(l, r) == gets2(l, r))
            cout << "Budada\n";
        else
        {
            if ((r - l + 1) % 2 == 0)
                cout << "Budada\n";
            else
                cout << "Putata\n";
        }
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值