首页 > 其他分享 >2023JSCPC江苏省赛

2023JSCPC江苏省赛

时间:2024-05-14 22:19:49浏览次数:26  
标签:10 cout PII int string 江苏省 dp 2023JSCPC

2023江苏省赛

Dashboard - 2023 Jiangsu Collegiate Programming Contest, 2023 National Invitational of CCPC (Hunan), The 13th Xiangtan Collegiate Programming Contest - Codeforces

I - Elevator

void solve()
{
    cin>>n>>m;
    cout<<n-m+1<<endl;
}

H - Neil's Machine

/*
 * @Author     : Danc1ng
 * @Date       : 2024-05-07 19:17:01
 * @FilePath   : H - Neil's Machine
 * @Origin     :
 * @Description:
 * @Solution   :
 */
#include <bits/stdc++.h>
#define bug cout << "***************" << endl
#define look(x) cout << #x << " -> " << x << endl
#define endl '\n'
#define int long long
#define YES cout << "YES" << endl;
#define NO cout << "NO" << endl;

using namespace std;
typedef pair<int, int> PII;

constexpr int N = 2e5 + 10 , INF = 2e9;

int n;
char a[N],b[N];
int c[N];

void solve()
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<n;i++) cin>>b[i];

    for(int i=0;i<n;i++)
    {
        c[i]=((b[i]-a[i])%26+26)%26;
        // cout<<c[i]<<" \n"[i==n-1];
    }

    int ans=0;
    bool flag=false;
    int l=n;
    for(int i=0;i<n;i++)
    {
        if(c[i]!=0)
        {
            l=i;
            break;
        }
    }

    if(l==n)
    {
        cout<<0<<endl;
        return;
    }

    int tp=0;
    for(int i=l;i<n;i++)
    {
        ans++;
        tp=(tp+c[i])%26;
        while(c[i+1]==c[i]&&i+1<n) i++;
    }

    cout<<ans<<endl;
}


signed main()
{
    //freopen("check.in","r",stdin);
    //freopen("check.out","w",stdout);
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

    solve();



    return 0;
}

J - Similarity (Easy Version)

/*
 * @Author     : Danc1ng
 * @Date       : 2024-05-07 19:22:16
 * @FilePath   : J - Similarity (Easy Version)
 * @Origin     :
 * @Description:
 * @Solution   :
 */
#include <bits/stdc++.h>
#define bug cout << "***************" << endl
#define look(x) cout << #x << " -> " << x << endl
#define endl '\n'
#define int long long
#define YES cout << "YES" << endl;
#define NO cout << "NO" << endl;

using namespace std;
typedef pair<int, int> PII;

constexpr int N = 2e5 + 10 , INF = 2e9;

int n;
string s[N];

int calc(string a,string b)
{
    int len1=a.size(),len2=b.size();
    vector<vector<int>> dp(len1+1,vector<int>(len2+1));

    for(int i=0;i<len1;i++)
        for(int j=0;j<len2;j++)
            dp[i][j]=0;


    int ans=0;
    for(int i=1;i<=len1;i++)
        for(int j=1;j<=len2;j++)
        {
            if(a[i-1]==b[j-1])
            {
                dp[i][j]=dp[i-1][j-1]+1;
                ans=max(ans,dp[i][j]);
            }
            else dp[i][j]=0;
        }

    return ans;
}

void solve()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>s[i];
    }

    int ans=0;
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            ans=max(ans,calc(s[i],s[j]));
        }
    }

    cout<<ans<<endl;
}


signed main()
{
    //freopen("check.in","r",stdin);
    //freopen("check.out","w",stdout);
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    int T;
    //T=1;
    cin>>T;
    while(T--)
    {
      solve();
    }



    return 0;
}

A - Today's Word

思路:

考虑当\(Sk\)长度超过\(2m\)时,再进行一次操作后,其长度为$ m\(的后缀只会进行\)next(·)\(变换,把这个长为\)m\(的后缀的 每个字符变成下一个字符。因此考虑暴力将\)S_0$按构造方式 操作,求出一个长度大于\(2m\)的\(S_k\),取\(S_k\)长度为\(m\)的后 缀进行\(next(·)\)变换即可。 容易观察到\(next(·)\)变换操作的循环节为26,因此只需对这个后缀进行\((10^{100}−k)mod26\)次\(next(·)\)变换即可,也就是将这个长为m的后缀中的每个字母变为它后面第 \((10^{100}−k)mod26\)个字母,经过简单计算即可求出

/*
 * @Author     : Danc1ng
 * @Date       : 2024-05-07 19:45:12
 * @FilePath   : A - Today's Word
 * @Origin     :
 * @Description:
 * @Solution   :
 */
#include <bits/stdc++.h>
#define bug cout << "***************" << endl
#define look(x) cout << #x << " -> " << x << endl
#define endl '\n'
#define int long long
#define YES cout << "YES" << endl;
#define NO cout << "NO" << endl;

using namespace std;
typedef pair<int, int> PII;

constexpr int N = 100 + 10 , INF = 2e9,mod=26;

int n,m;
string s;

string next(string s,int k)
{
    for(int i=0;i<s.size();i++)
    {
        s[i]=((s[i]-'a')+k)%26+'a';
    }
    return s;
}

string change(string s)
{
    int len=s.size()/2;
    string res=s.substr(0,len);
    res+=s;
    res+=next(s.substr(len),1);
    return res;
}

void solve()
{
    cin>>n>>m;
    cin>>s;

    int cur=0;
    while(s.size()<m*2)
    {
        cur++;
        s=change(s);
    }

    s=next(s,((16-cur)%26+26)%26);
    cout<<s.substr(s.size()-m)<<endl;
}


signed main()
{
    //freopen("check.in","r",stdin);
    //freopen("check.out","w",stdout);
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

    solve();

    return 0;
}

F - Timaeus

题意:

你有A个原料,每B个合成一个产品。每一次合成你可以选择下列两种buff的任意一种:

1.P%的概率合成双倍产物

2.Q%的概率返还一个原料 求期望最多合成多少产物。

思路:

设\(dp[i]\)表示还剩下i个原料时的最大期望,则\(dp[i]=max\{P\times(dp[i-B]+2)+(1-P)\times(dp[i-B]+1),Q\times(dp[i-B+1]+1)+(1-Q)\times(dp[i-B]+1)\)

当\(B=1\)时选择第二种buff是最优的,有\(Q%\)的概率不需要花费,也就是\(1-Q%\)的概率消耗一个原料,

/*
 * @Author     : Danc1ng
 * @Date       : 2024-05-07 20:48:38
 * @FilePath   : F - Timaeus
 * @Origin     : https://codeforces.com/gym/104396/problem/F
 * @Description:
 * @Solution   :
 */
#include <bits/stdc++.h>
#define bug cout << "***************" << endl
#define look(x) cout << #x << " -> " << x << endl
#define endl '\n'
#define int long long
#define YES cout << "YES" << endl;
#define NO cout << "NO" << endl;

using namespace std;
typedef pair<int, int> PII;

constexpr int N = 1e6 + 10 , INF = 2e9;

int a,b;
double p,q;
double dp[N];

void solve()
{
    cin>>a>>b>>p>>q;

    p/=100,q/=100;
    for(int i=b;i<=a;i++)
    {
        dp[i]=max(p*(dp[i-b]+2)+(1-p)*(dp[i-b]+1),q*(dp[i-b+1]+1)+(1-q)*(dp[i-b]+1));
    }

    double ans;
    if(b==1) ans=max(a*1.0/(1-q),dp[a]);
    else ans=dp[a];

    cout<<fixed<<setprecision(12)<<ans<<endl;

}


signed main()
{
    //freopen("check.in","r",stdin);
    //freopen("check.out","w",stdout);
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

    solve();

    return 0;
}

K - Similarity (Hard Version)

题意:

构造\(n\)个不同的长度为\(k\)的只由小写字符组成的字符串, 使得其两两之间最长公共子串的最大值等于\(m\)。

思路:
  • \(m=0,n>26\)时,无解
  • \(m\neq 0,m>=k\)时,无解

\(m=0\)时,直接输出长度为\(k\)的只由第\(i\)个字母组成的小写字母组成的串即可。

\(m\neq0\)时,构造出\(a_1a_2a_1a_2a_1a_2a_1a_2···\)的字符串

那么对于这种类型的串一共有\(\frac{25×(25−1)}2 =300\)种,两两之 间的最长公共子串长度均不超过1。

那么答案构造即可为,取上述形式的串前\(k−m+1\)位,拼上\(m−1\)位z即可得到满足题目要求的\(n\)个串。

#include <bits/stdc++.h>
#define bug cout << "***************" << endl
#define look(x) cout << #x << " -> " << x << endl
#define endl '\n'
#define int long long
#define YES cout << "YES" << endl;
#define NO cout << "NO" << endl;

using namespace std;
typedef pair<int, int> PII;

constexpr int N = 300 + 10 , INF = 2e9;

int n,m,k;
vector<pair<char,char>> vi;

void print(char c)
{
    cout<<c;
}

void print_1()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
            print(i+'a'-1);
        cout<<endl;
    }
}

void print_2()
{
    for(int i=1;i<=k;i++) print('a');
        cout<<endl;
        for(int i=1;i<=k;i++)
            i<=m?print('a'):print('b');
        cout<<endl;

        for(int i='a';i<='z';i++)
            for(int j=i+1;j<='z';j++)
            {
                vi.push_back({i,j});
            }

        for(int i=3;i<=n;i++)
        {
            char c1=vi[i-2].first,c2=vi[i-2].second;
            for(int j=1;j<=k;j++)
            {
                if(j&1) print(c1);
                else print(c2);
            }
            cout<<endl;
        }
}

void solve()
{
    cin>>n>>m>>k;

    if(m>=k||m==0&&n>26)
        cout<<"No\n";
    else
    {
        cout<<"Yes\n";
        if(m==0) print_1();
        else print_2();
    }

}


signed main()
{
    //freopen("check.in","r",stdin);
    //freopen("check.out","w",stdout);
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

    solve();

    return 0;
}

标签:10,cout,PII,int,string,江苏省,dp,2023JSCPC
From: https://www.cnblogs.com/Danc1ng/p/18192382/2023ccpc-Jiangsu-Provincial

相关文章

  • 2024江苏省大学生程序设计大赛(JSCPC)热身赛题解(B)
    题目大意:求区间\([l,r]\)中有多少正整数满足\(\phi(\phi(n))=\phi(n)-1\),其中\(\phi\)为欧拉函数。解:设\(y=\phi(n)\),则上式变为\(\phi(y)=y-1\),易证\(y\)为质数(注意\(\phi(1)=1\),\(1\)与任何正整数都互质)。故原问题转化为求\([l,r]\)中有多少个正整数v满足\(\phi......
  • JOU江苏省大学生程序设计竞赛选拔赛
    A题:importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);Stringst=in.next();Stringsd=in.next();Stringt1=in.next();Stringt2=in.next();......
  • 个人题解:江苏省选 2019 第二轮
    精准预测我们首先发现每个人每个时刻只有生死,所以我们可以建一个2-sat模型。每个人对应\(T+1\)个节点,表示这个人在每个时刻的生死。那么,题目的条件可以直接在这个模型上面建图,还要注意第\(t\)秒死亡可推出第\(t+1\)秒死亡和第\(t+1\)秒存活能推出第\(t\)秒存活的两......
  • 储迹附网存储助力河海大学(江苏省信创实验室)信创课程综合管理系统
    河海大学是一所拥有百余年办学历史,以水利为特色,工科为主,多学科协调发展的教育部直属全国重点大学,是实施国家“211工程”重点建设、国家优势学科创新平台建设、“双一流”建设以及教育部批准设立研究生院的高校。一百多年来,学校在治水兴邦的奋斗历程中发展壮大,被誉为“水利高层次创......
  • 飞驰云联连续3年入选“江苏省软件企业核心竞争力企业”!
    2023年12月28日,“构建数字经济新基座,共筑软件产业新生态——第五届江苏软件产业发展大会”暨江苏省软件行业协会七届理事会第九次会议在南京成功召开。会上,公布了“2023年江苏省软件企业核心竞争力评价”工作结果,Ftrans飞驰云联凭借卓越的软件技术实力和核心竞争力,成功获评“2023......
  • 为江苏省计量院提供数套时间间隔合成发生器/时间间隔发生器,时间间隔合成器
    我公司为江苏计量科学研究院提供了数套时间间隔发生器。时间间隔合成器是一种用于测量时间间隔的仪器,可以准确测量任何工作或试验之间的时间间隔。它可以用于各种实验从简单的响应时间测试到更复杂的实验。江苏省计量院的主要职责包括:监督和管理国家计量标准、计量认证和认可;负责国......
  • 棱镜七彩获评“2023年江苏省软件企业核心竞争力(创新型)企业”
    近日,由省工业和信息化厅指导,江苏省软件行业协会主办的“构建数字经济新基座,共筑软件产业新生态——第五届江苏软件产业发展大会”暨江苏省软件行业协会七届理事会第九次会议在南京成功召开。本次会议上发布了2023年江苏省软件企业核心竞争力评价结果并进行颁奖授牌,棱镜七彩凭借卓越......
  • 江苏省发展情况统计报告可视化:揭示经济新动态,共创美好未来
    注:大屏中涉及数据为虚拟数据,非真实数据。 随着信息时代的到来,数据已经成为了我们理解世界、制定决策的重要依据。江苏省作为我国的重要经济区域,其发展情况一直备受关注。 为了更直观地展示江苏省的发展状况,近日小编使用山海鲸可视化制作了一张江苏省发展情况统计报告可视化......
  • 喜报|棱镜七彩获评江苏省专精特新中小企业
    近日,江苏省工业和信息化厅发布《关于江苏省2023年专精特新中小企业和2020年度专精特新企业复核通过企业名单的公示》,棱镜七彩成功入选2023年江苏省省级专精特新中小企业名单。图2023年省级专精特新中小企业公式名单节选“专精特新”是国家为鼓励中小企业实现专业化运营、精细化产......
  • 【专题】2023江苏省工业园区绿色低碳发展路径研究报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34132自18世纪中期工业革命以来,人类进入工业社会。在历次工业革命中,人类通过发明创造和管理革新,改进生产方式、降低成本、提高效率,随之而来的是生活、物质、文化、教育等各方面的变化,人际关系和社会结构也得以重塑。如今,数字化技术的发展为工业注入......