• AtCoder ABC344 A-E题解


    传送门:ABC344

    咕了一个周的题解。省流:D>E+不可以总司令专场 ohhhhhhhhhhhhhhhhhhhhhhhhhh

    Problem A:

    善用STL。

    1. #include
    2. using namespace std;
    3. int main(){
    4. string S;
    5. cin>>S;
    6. int i=S.find('|');j=S.find('|',i+1);
    7. cout<substr(0,i)+S.substr(j+1)<
    8. return 0;
    9. }

    Problem B:

    依旧签到。

    1. #include
    2. using namespace std;
    3. int main(){
    4. vector<int> A;
    5. while(true){
    6. int a;
    7. cin>>a;
    8. A.push_back(a);
    9. if(a==0)
    10. break;
    11. }
    12. reverse(A.begin(),A.end());
    13. for(auto a:A)
    14. cout<' ';
    15. return 0;
    16. }

    Problem C:

    你以为要用高端算法(如dp),但是1\leq N,M,L\leq100,ohhhhhhhhhhhhhhhhh!!!!!

    1. #include
    2. using namespace std;
    3. int A[105],B[105],C[105];
    4. int main(){
    5. int N;
    6. cin>>N;
    7. for(int i=1;i<=N;i++)
    8. cin>>A[i];
    9. int M;
    10. cin>>M;
    11. for(int i=1;i<=M;i++)
    12. cin>>B[i];
    13. int L;
    14. cin>>L;
    15. for(int i=1;i<=L;i++)
    16. cin>>C[i];
    17. set<int> sum;
    18. for(int i=1;i<=N;i++){
    19. for(int j=1;j<=M;j++){
    20. for(int k=1;k<=L;k++)
    21. sum.insert(A[i]+B[j]+C[k]);
    22. }
    23. }
    24. int Q;
    25. cin>>Q;
    26. while(Q--){
    27. int X;
    28. cin>>X;
    29. if(sum.count(X))
    30. cout<<"YES"<
    31. else
    32. cout<<"NO"<
    33. }
    34. return 0;
    35. }

    Problem D:

    一看就知道是DP。NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

    没关系,向来我都是只要dfs能做,就绝不DP的思想,写出了如下代码↓

    1. #pragma GCC optimize(3)
    2. #include
    3. using namespace std;
    4. int N,ans=INT_MAX;
    5. int A[105];
    6. string T,S[105][15];
    7. void dfs(int idx,int cnt,string cur){
    8. if(idx>N){
    9. if(cur==T)
    10. ans=min(ans,cnt);
    11. return;
    12. }
    13. for(int i=1;i<=A[idx];i++){
    14. string p=cur+S[idx][i];
    15. if(p.size()<=T.size() && p==T.substr(0,p.size()))
    16. dfs(idx+1,cnt+1,p);
    17. }
    18. dfs(idx+1,cnt,cur);
    19. }
    20. int main(){
    21. cin>>T>>N;
    22. for(int i=1;i<=N;i++){
    23. cin>>A[i];
    24. for(int j=1;j<=A[i];j++)
    25. cin>>S[i][j];
    26. }
    27. dfs(1,0,"");
    28. if(ans==INT_MAX)
    29. cout<<-1<
    30. else
    31. cout<
    32. return 0;
    33. }

    然后就寄了。 (我甚至还吸了氧,还是O3的那种)

    但是,我是绝不会服输的!

    所以我发现,可以用mem数组记录搜索到第i个背包,字符串长度为j的最少代价,然后不断更新mem数组即可(总算是卡过了)。

    1. #pragma GCC optimize(3)
    2. #include
    3. using namespace std;
    4. int N,ans=INT_MAX;
    5. int A[105],mem[105][1005];
    6. string T,S[105][15];
    7. void dfs(int idx,int cnt,string cur){
    8. if(idx>N){
    9. if(cur==T)
    10. ans=min(ans,cnt);
    11. return;
    12. }
    13. /*
    14. if(cnt>=ans || cnt>=mem[idx][cur.size()])
    15. return;
    16. mem[idx][cur.size()]=cnt;
    17. */
    18. for(int i=1;i<=A[idx];i++){
    19. string p=cur+S[idx][i];
    20. if(p.size()<=T.size() && p==T.substr(0,p.size()))
    21. dfs(idx+1,cnt+1,p);
    22. }
    23. dfs(idx+1,cnt,cur);
    24. }
    25. int main(){
    26. cin>>T>>N;
    27. for(int i=1;i<=N;i++){
    28. cin>>A[i];
    29. for(int j=1;j<=A[i];j++)
    30. cin>>S[i][j];
    31. /*
    32. for(int j=0;j<=1000;j++)
    33. mem[i][j]=INT_MAX;
    34. */
    35. }
    36. dfs(1,0,"");
    37. if(ans==INT_MAX)
    38. cout<<-1<
    39. else
    40. cout<
    41. return 0;
    42. }

    还是稍微说一下dp罢。我们就让dp_{i,j}为搜索到第i个背包字符串长度为j的最少代价就可以了。在判断一下TA(答案)是否和T匹配就行了。

    说句闲话:经亲身测试,直接说"不可以,总司令"可得50+pts(30/58)

    Problem E:

    就是链表。太水了。

    1. #include
    2. using namespace std;
    3. const int maxn=200005;
    4. int A[maxn];
    5. int main(){
    6. int N;
    7. cin>>N;
    8. for(int i=0;i
    9. cin>>A[i];
    10. map<int,int> prv,nxt;
    11. for(int i=0;i-1;i++){
    12. prv[A[i+1]]=A[i];
    13. nxt[A[i]]=A[i+1];
    14. }
    15. prv[A[0]]=0;
    16. nxt[0]=A[0];
    17. prv[0]=A[N-1];
    18. nxt[A[N-1]]=0;
    19. int Q;
    20. cin>>Q;
    21. while(Q--){
    22. int Query;
    23. cin>>Query;
    24. if(Query==1){
    25. int x,y;
    26. cin>>x>>y;
    27. nxt[y]=nxt[x];
    28. prv[nxt[x]]=y;
    29. nxt[x]=y;
    30. prv[y]=x;
    31. }
    32. else{
    33. int x;
    34. cin>>x;
    35. prv[nxt[x]]=prv[x];
    36. nxt[prv[x]]=nxt[x];
    37. }
    38. }
    39. for(int i=nxt[0];i!=0;i=nxt[i])
    40. cout<
    41. return 0;
    42. }

    OK,以上↗就是本期的全部内容了。我们下期再见!

    温馨提示:本期的所有代码都有问题,请不要无脑Ctrl C+Ctrl V(你会挂的很惨)

  • 相关阅读:
    HTB Runner
    【入门】使用sklearn实现的KNN算法:鸢尾花数据集分类预测
    轻量化的 vue3 后台管理系统模板
    nnunetv2训练报错 ValueError: mmap length is greater than file size
    LeetCode220730_62、位1的个数
    最短路径算法之一:单源无权图,python实现
    fastadmin框架如何开启事务
    qmt量化交易策略小白学习笔记第29期【qmt编程之获取行业概念数据--如何下载板块分类信息及历史板块分类信息】
    java和数据库之间的关系,看这一篇就足够~~~
    若依 ruoyi 路径 地址 # 井号去除
  • 原文地址:https://blog.csdn.net/seanli1008/article/details/136788211