首页 > 其他分享 >Codeforces Round 903 (Div. 3)(A~F)

Codeforces Round 903 (Div. 3)(A~F)

时间:2024-08-01 20:23:49浏览次数:17  
标签:903 const int nullptr Codeforces long cin Div define

目录

A. Don't Try to Count

B. Three Threadlets

C. Perfect Square

D. Divide and Equalize

E. Block Sequence

F. Minimum Maximum Distance


A. Don't Try to Count

Problem - A - Codeforces

因为字符串的长度很小,我们可以暴力求解,每次操作都可以使字符串s的长度倍增,可以在s的子串找到字符串t的条件是s长度必须要长于t,当长度比t长还是没有找到答案基本就可以返回-1了。

#include<bits/stdc++.h>
#define int long long  
#define TEST int T; cin >> T; while (T--)
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
const int N = 1e5 + 10;
const int M = 1e3 + 10;
using namespace std;
bool ok(string a, string b)
{
    if (a.size() < b.size()) return false;
    for (int i = 0; i < a.size() - b.size() + 1; i++)
    {
        if (a.substr(i, b.size()) == b) return true;
    }
    return false;
}
void solve() {
    int n, m;
    cin >> n >> m;
    string s, t;
    cin >> s >> t;
    int ans = 0;
    bool can = true;
    while (!ok(s, t))
    {
        
        ans++;
        string temp = s;
        s.reserve();
        s = temp + s;
        if (ans > 6)
        {
            can = false;
            break;
        }
    }
    if (can)
        cout << ans << "\n";
    else cout << "-1\n";
}
signed main() {
    ios;
    TEST
        solve();
    return 0;
}

B. Three Threadlets

Problem - B - Codeforces

数学思维题,我们必须将所有绳子的长度变成一样的,但是剪最短的绳子只会得到更短的,此时其他的绳子也要剪得更短,所以对最短的绳子操作是不优的,因为我们的次数只有三次。

其余两个绳子的长度为最短的绳子的长度的公倍数才有答案,要剪的次数就是其余两个绳子除最大的绳子的除数的和。

#include<bits/stdc++.h>
#define int long long  
#define TEST int T; cin >> T; while (T--)
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
const int N = 1e5 + 10;
const int M = 1e3 + 10;
using namespace std;

void solve() {
    vector<int>a(4);
    for (int i = 1; i <= 3; i++) cin >> a[i];
    sort(a.begin() + 1,a.end());
    int mi = a[1];
    int ans = 0;
    for (int i = 2; i <= 3; i++)
    {
        if (a[i] % mi != 0)
        {
            cout << "NO\n";
            return;
        }
        ans += (a[i] / mi) - 1;
    }
    if (ans <= 3) cout << "YES\n";
    else cout << "NO\n";
}
signed main() {
    ios;
    TEST
        solve();
    return 0;
}

C. Perfect Square

Problem - C - Codeforces

模拟一下,每个字符的位置都有三个匹配的位置,我们要求的就是将这四个位置变成这四个位置的最大值的次数和。

#include<bits/stdc++.h>
#define int long long  
#define TEST int T; cin >> T; while (T--)
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
const int N = 1e5 + 10;
const int M = 1e3 + 10;
using namespace std;
char temp[1001][1001];
void solve() {
    int n;
    cin >> n;
    vector<string>st(n);
    for (int i = 0; i < n; i++) cin >> st[i];
    int ans = 0;
    for (int i = 0; i < n / 2; i++)
    {
        for (int j = 0; j < n / 2; j++)
        {
            int m1 = st[i][j], m2 = st[j][n - 1 - i], m3 = st[n - 1 - i][n - 1 - j], m4 = st[n - 1 - j][i];
            int mx = max({ m1,m2,m3,m4 });
            ans += mx * 4 - (m1 + m2 + m3 + m4);
        }
    }
    cout << ans << "\n";

}
signed main() {

    TEST
        solve();
    return 0;
}

D. Divide and Equalize

Problem - D - Codeforces

就是看看是否有一个数的n次方等于数组所有元素相乘。

但是直接暴力去求解会爆数据,所有我们可以找到所有因子的个数,看看这些因子的个数可不可以平均分配给n个数。

#include<bits/stdc++.h>
#define int long long  
#define TEST int T; cin >> T; while (T--)
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
const int N = 2e6 + 10;
const int M = 1e3 + 10;
using namespace std;
void solve() {
    int n;
    cin >> n;
    vector<int>a(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    map<int, int>q;
    for (int i = 0; i < n; i++)
    {
        if (a[i] > 1)
        {
            for (int j = 2; j * j <= a[i]; j++)
            {
                while (a[i] % j == 0)
                {
                    q[j]++;
                    a[i] /= j;
                }
            }
        }
        q[a[i]]++;
    }
    for (auto it: q)
    {
        if (it.first > 1)
        {
            if (it.second % n != 0)
            {
                cout << "NO\n";
                return;
            }
        }
    }
    cout << "YES\n";
}
signed main() {
    ios;
    TEST
    solve();
    return 0;
}

E. Block Sequence

Problem - E - Codeforces

从n到1动态规划答案。

#include<bits/stdc++.h>
#define int long long  
#define TEST int T; cin >> T; while (T--)
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
const int N = 1e6 + 10;
const int M = 1e3 + 10;
using namespace std;

void solve() {
    int n;
    cin >> n;
    vector<int>a(n + 1);
    for (int i = 1; i <= n; i++)  cin >> a[i];
    vector<int>dp(n + 2, 0x7fffffff);
    dp[n + 1] = 0;
    for (int i = n; i >= 1; i--)
    {
        dp[i] = min(dp[i], dp[i + 1] + 1);
        if (i + a[i] <= n)
        {
            dp[i] = min(dp[i], dp[i + a[i] + 1]);
        }
    }
    cout << dp[1] << "\n";
}
signed main() {
    ios;
    TEST
        solve();
    return 0;
}

F. Minimum Maximum Distance

Problem - F - Codeforces

了解到题目要求我们去求一个节点到最远标记点的最小距离。

我们发现答案存在于最远标记点之间的节点。

答案就是最远标记点的距离除以2向上取整。

求最远距离就是需要去了解树的直径的知识了,两次dfs可以求出来。

#include<bits/stdc++.h>
#define int long long  
#define TEST int T; cin >> T; while (T--)
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
const int N = 1e6 + 10;
const int M = 1e3 + 10;
using namespace std;
int n, k;
vector<vector<int>>f;
int dis[N];
void dfs(int now, int pre)
{
    if (pre != -1) dis[now] = dis[pre] + 1;
    for (auto x : f[now])
    {
        if (x == pre) continue;
        dfs(x, now);
    }
}
void solve() {

    cin >> n >> k;
    for (int i = 0; i <= n; i++) f.clear(), dis[i] = 0;
    f.resize(n + 1);
    vector<int>tag(k + 1);
    for (int i = 1; i <= k; i++)
    {
        cin >> tag[i];
    }
    for (int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;
        f[u].push_back(v);
        f[v].push_back(u);
    }
    if (k == 1)
    {
        cout << "0\n";
        return;
    }
    int ans;
    dis[0] = -1;
    dfs(1, -1), ans = tag[1];
    for (int i = 1; i <= k; i++) if (dis[tag[i]] > dis[ans]) ans = tag[i];
    for (int i = 1; i <= n; i++) dis[i] = 0;
    dis[0] = -1;
    dfs(ans, -1);
    ans = tag[1];
    for (int i = 1; i <= k; i++) if (dis[tag[i]] > dis[ans]) ans = tag[i];
    cout << (dis[ans] + 1) / 2 << "\n";
}
signed main() {
    ios;
    TEST
        solve();
    return 0;
}

标签:903,const,int,nullptr,Codeforces,long,cin,Div,define
From: https://blog.csdn.net/2301_80314483/article/details/140826589

相关文章

  • CodeForces 1619D New Year's Problem
    题目链接:CodeForces1619D【NewYear'sProblem】思路    可以因为最多只能逛n-1个商店,当n-1大于等于m的时候,所有朋友都能取最大值,否则至少有两个人要选择相同的商店,所以依次枚举两个人选择同一个商店,其他人选择喜悦值最大的商店。代码#include<cstddef>#incl......
  • Educational Codeforces Round 168 (Rated for Div. 2) 赛后总结
    比赛链接赛时提交情况:CF1997A.StrongPassword赛时思路首先看到题目可以想到的是,我们要加入的这个字符不能与其相邻字符相同,所以我没有多想就写出了第一份代码:if(s[0]=='a')cout<<'b';elsecout<<'a';cout<<s<<endl;交上之后喜提WA1。于是冷静了一会儿仔细观察了一......
  • CodeForces 1132B Discounts
    题目链接:CodeForces1132B【Discounts】思路    因为使用coupons购买q[i]块巧克力,不需要付最便宜的那块巧克力的钱,所以为了使得优惠最大化,所以可以在使用优惠券的时候购买最贵的p[i]块巧克力,所以计算所有巧克力价格高之和和排序后很快能得到答案。代码#include<cst......
  • CodeForces 1873A Short Sort
    题目链接:CodeForces1873A【ShortSort】思路    签到题,因为能交换两个元素的位置,所以只需要判断是否有一个元素在他原来该在的位置上就行。代码#include<iostream>#include<cstring>usingnamespacestd;#definelllonglongconstintN=1e5+10;void......
  • 一个div 使用flex 布局2个div,第一个div占75%,另一个占25%
    <divclass="container"><divclass="childchild-75">第一个div</div><divclass="childchild-25">第二个div</div></div>.container{display:flex;/*启用Flexbox*/width:100%;/*假设容器占满整......
  • flex 一行放四div 每个div 放三个div
    <!DOCTYPEhtml><html><head><style>.container{display:flex;flex-wrap:wrap;}.outer-div{display:flex;width:25%;/*每个外部div占据100%宽度的25%*/box-sizing:border-box;padding:10px;/*根据需要调整间距......
  • 题解:Pinely Round 4 (Div. 1 + Div. 2) C
    C.AbsoluteZerotimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouaregivenanarray\(a\)of\(n\)integers.Inoneoperation,youwillperformthefollowingtwo-stepmove:Choose......
  • CodeForces 908C New Year and Curling
    题目链接:CodeForces908C【NewYearandCurling】思路    模拟,考虑到两个圆盘可能出现y值相同且相接的情况,所以在判断当前圆盘的y值时循环的范围从在前圆盘的x值左右浮动2r,依次遍历这个范围内的数组y(存储的是当前已经移动了圆盘中的横坐标为i的圆盘的最大的y值),然后可......
  • Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]
    思路不难想,细节比较多。思路观察到\(n\le19\),首先想到状压dp。于是自然地定义\(dp[j][i]\)为:抵达点的状态为\(i\),且此时在点\(j\)时,简单路径的条数。注意这里是简单路径的条数,而不是环的个数,因为环的个数要在dp过程中统计。这里的dp作用就在于求简单路径条数。......
  • Codeforces Round 943 (Div. 3)A~E
    A.Maximize?题目大意:给你一个数x,你需要找到一个数y(1<=y<x),使得gcd(x,y)+y值最大,然后输出这个y思路:看范围暴力即可voidsolve(){inta,b=0,maxx=0,bj=0;cin>>a;for(inti=1;i<a;i++){b=__gcd(a,i);b+=i;if(maxx<b)......