• AC修炼计划(AtCoder Regular Contest 163)


    传送门:AtCoder Regular Contest 163 - AtCoder

    第一题我们只需要将字符串分成两段,如果存在前面一段比后面一段大就成立。

    1. #include
    2. #define int long long
    3. using namespace std;
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int N=1000000007;
    7. int n,k;
    8. void icealsoheat(){
    9. cin>>n;
    10. string s;
    11. cin>>s;
    12. for(int i=1;i
    13. if(s.substr(0,i)substr(i)){
    14. puts("Yes");
    15. return;
    16. }
    17. }
    18. puts("No");
    19. }
    20. signed main(){
    21. ios::sync_with_stdio(false);
    22. cin.tie();
    23. cout.tie();
    24. int _;
    25. _=1;
    26. cin>>_;
    27. while(_--){
    28. icealsoheat();
    29. }
    30. }

    B - Favorite Game

    第二题也比较基础,我们可以先把后面的数组排序,然后枚举每一段(每一段的长度为k,包含按顺序的k个数)

    代码如下:

    1. #include
    2. #define int long long
    3. using namespace std;
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int N=1000000007;
    7. int n,k;
    8. int b[1000005];
    9. void icealsoheat(){
    10. int le,re;
    11. cin>>n>>k;
    12. cin>>le>>re;
    13. n-=2;
    14. int an=0;
    15. for(int i=1;i<=n;i++){
    16. cin>>b[i];
    17. if(b[i]>=le&&b[i]<=re)an++;
    18. }
    19. sort(b+1,b+1+n);
    20. if(an>=k){
    21. cout<<0;
    22. return;
    23. }
    24. int ans=0x3f3f3f3f3f3f3f3f;
    25. for(int i=1;i<=n-k+1;i++){
    26. int xx=0;
    27. if(le>b[i])xx+=abs(le-b[i]);
    28. if(re-1])xx+=abs(re-b[i+k-1]);
    29. ans=min(ans,xx);
    30. }
    31. cout<
    32. }
    33. signed main(){
    34. ios::sync_with_stdio(false);
    35. cin.tie();
    36. cout.tie();
    37. int _;
    38. _=1;
    39. // cin>>_;
    40. while(_--){
    41. icealsoheat();
    42. }
    43. }

    C - Harmonic Mean

    这题想到了裂项相消公式,但是没有想到给他们分开。

    当存在n=t*(t+1)的时候,我们不能直接用数列(2,6,12,20.。。。。(n-1)*n,n)

    而是把后n-1项看成一部分,使后n-1项的和等于1,然后把每一个项数*2,此时的后n-1项的总和为1/2,这时候我们只需要再放入一个2即可

    代码如下:

    1. #include
    2. using namespace std;
    3. #define int long long
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int N=998244353;
    7. const int MX=0x3f3f3f3f3f3f3f3f;
    8. int n,k;
    9. map<int,int>hh;
    10. void yu(){
    11. for(int i=1;i<=500;i++){
    12. hh[i*(i+1)]=1;
    13. }
    14. }
    15. void icealsoheat(){
    16. cin>>n;
    17. if(n==2)cout<<"No\n";
    18. else{
    19. cout<<"Yes\n";
    20. if(n==1)cout<<"1\n";
    21. else if(n==3)cout<<"2 3 6\n";
    22. else{
    23. vector<int>ans;
    24. if(hh[n]){
    25. n--;
    26. for(int i=1;i
    27. ans.push_back(2ll*i*(i+1ll));
    28. }
    29. ans.push_back(2ll*n);
    30. cout<<"2 ";
    31. for(auto i:ans){
    32. cout<" ";
    33. }
    34. }
    35. else{
    36. for(int i=1;i
    37. cout<1)<<" ";
    38. }
    39. cout<
    40. }
    41. cout<<"\n";
    42. }
    43. }
    44. }
    45. signed main(){
    46. ios::sync_with_stdio(false);
    47. cin.tie();
    48. cout.tie();
    49. int _;
    50. _=1;
    51. yu();
    52. cin>>_;
    53. while(_--){
    54. icealsoheat();
    55. }
    56. }

    D - Sum of SCC

    好厉害的题,开拓了我的视野。不看题解我是真想不到竟然还能这么dp。

    我们可以知道,统计SSG(强连通分量)是很难统计的。竞赛图有一个性质:当我们把强连通分量缩点之后,拉直,整个竞赛图会变成一条很长的链,并且,长的链上的任何两个点之间都有一个链(很抽象又很神奇的想法)。既然变成了一个长长的链,那么其实我们可以通过在长链上某点进行一刀切,使其分成左右两个集合,分别是集合A与集合B,同时,我们定义集合A的所有点都与集合B的相连。且集合A的数字较小,集合B的数字较大。

    我们用三维dp i,j,k来进行动态规划。i表示我们只有前i个点儿的状态,j表示A集合中有j个点儿,k表示有k条小数向大数连的边。

    我们每次塞进去第i个点儿,有两种情况:

    1.将该点儿塞入集合A中,那么该点儿可以从集合A中选择p个点使这p个点儿指向该点儿。

    dp[i+1][j+1][k+p]+=dp[i][j][k]*c[j][p]

    2.将该点儿塞入集合B中,那么A点都会指向该点儿,同时我们可以选取B集合中p个点儿,使其指向该点儿。

    dp[i+1][j][j+k+p]+=dp[i][j][k]*c[i-j][p]

    代码如下:

    1. #include
    2. #define int long long
    3. using namespace std;
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int mod=998244353;
    7. int n,m;
    8. int c[505][505];
    9. void init(int mx)
    10. {
    11. for(int i=0;i<=mx;i++)
    12. for(int j=0;j<=i;j++) c[i][j]=j?(c[i-1][j-1]+c[i-1][j])%mod:1;
    13. }
    14. void icealsoheat(){
    15. cin>>n>>m;
    16. vector dp(50,vector(50,vector<int>(1600,0)));
    17. dp[0][0][0]=1;
    18. for(int i=0;i
    19. for(int j=0;j<=i;j++){
    20. for(int k=0;k<=i*(i-1)/2;k++){
    21. for(int p=0;p<=j;p++)(dp[i+1][j+1][k+p]+=dp[i][j][k]*c[j][p]%mod)%mod;
    22. for(int p=0;p<=i-j;p++)(dp[i+1][j][j+k+p]+=dp[i][j][k]*c[i-j][p]%mod)%mod;
    23. }
    24. }
    25. }
    26. int ans=0;
    27. for(int i=1;i<=n;i++){
    28. ans=(ans+dp[n][i][m])%mod;
    29. }
    30. cout<
    31. }
    32. signed main(){
    33. ios::sync_with_stdio(false);
    34. cin.tie();
    35. cout.tie();
    36. int _;
    37. _=1;
    38. // cin>>_;
    39. init(500);
    40. while(_--){
    41. icealsoheat();
    42. }
    43. }

  • 相关阅读:
    机器学习实战:Python基于LASSO回归进行正则化(十二)
    MCDF--lab03
    【李宏毅】机器学习——作业1-PM2.5预测
    SPA项目开发之表单验证&增删改功能
    《向量数据库指南》——Milvus Cloud向量数据库的优势
    智能座舱:汽车雷达的下一个战场
    YOLOv8-Seg改进: 全局多头自注意力MHSA,效果秒杀CBAM、SE | 分割注意力系列篇
    Python基本语法(未完待续)
    带433遥控紫外线照明灯触摸芯片-DLT8SA20A-杰力科创
    图片加水印怎么弄?小白都会的加水印方法
  • 原文地址:https://blog.csdn.net/kyrietheshy/article/details/134217526