• 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(你会挂的很惨)

  • 相关阅读:
    LeetCode Top100:两数之和-java版
    Arduino驱动ICG-20660L传感器(惯性测量传感器篇)
    二叉树与递归问题
    (免费领源码)php#mysql红色旅游网站99214-计算机毕业设计项目选题推荐
    深度学习之文本分类 ----FastText
    攻防世界题目练习——Web引导模式(二)
    Postgresql中的变长参数类型VARIADIC实例与限制
    独自一人开发一整套 ERP 系统是什么水平?
    Spring 中更加简单的存储 (五大类注解 + @bean 注解) 和读取 (属性注入 + Setter 注入 + 构造方法注入) 对象
    计算机丢失msvcr110.dll解决办法,多种msvcr110.dll解决方法分享
  • 原文地址:https://blog.csdn.net/seanli1008/article/details/136788211