zoukankan      html  css  js  c++  java
  • CF1296总结

    CF1296总结

    时隔多月,进行一下cf1296的总结

    A

    推推结论就出来的题目,亏我想了那么久

    #include <iostream>
    #include <cstdio>
     
    using namespace std;
     
    int main()
    {
      int t;
      scanf("%d",&t);
      while(t--)
      {
        int now,sum=0;
        bool bo=0,boo=0;
        scanf("%d",&now);
        for(int i=1;i<=now;i++)
        {
          int wee;
          scanf("%d",&wee);
          if(wee%2==1) bo=1;
          if(wee%2==0) boo=1;
          sum+=wee%2;
          sum%=2;
        }
        if(sum%2==1||(bo&&boo))
        {
          printf("YES
    ");
        }
        else
        {
          printf("NO
    ");
        }
      }
    }
    

    B

    b题就是一个贪心思路(?小学数学?)

    显然9分钱买10分的东西

    (下面的代码是当时脑瘫没想到直接除了就可以

    #include <iostream>
    #include <cstdio>
     
    using namespace std;
     
    int main()
    {
      int t;
      scanf("%d",&t);
      while(t--)
      {
        int now;
        long long ans=0;
        scanf("%d",&now);
        while(now>=10)
        {
          int t=now/10;
          ans+=t*10;
          now%=10;
          now+=t;
        }
        ans+=now;
        printf("%lld
    ",ans);
      }
    }
    

    C

    c题就是问中间的最短的一段是无效的

    直接用map维护状态

    用map查找前面的状态,如果没有重合的就是-1

    #include <iostream>
    #include <cstdio>
    #include <map>
     
    using namespace std;
     
    map<long long,int> m;
     
    int main()
    {
      int t;
      cin>>t;
      while(t--)
      {
        m.clear();
        int now;
        int ans=0x3f3f3f3f,l,r;
        cin>>now;
        long long h=0,z=0;
        m[0]=0;
        for(int i=1;i<=now;i++)
        {
          char wee;
          cin>>wee;
          if(wee=='L') h++;
          if(wee=='R') h--;
          if(wee=='U') z++;
          if(wee=='D') z--;
          if(m.find(h*200000+z)!=m.end())
          {
            int bzd=m[h*200000+z];
            if(i-bzd<ans)
            {
              ans=i-bzd;
              l=bzd+1;
              r=i;
            }
          }
          m[h*200000+z]=i;
        }
        if(ans==0x3f3f3f3f) cout<<-1<<endl;
        else cout<<l<<' '<<r<<endl;
      }
    }
    

    D

    这道题就是降智贪心题目

    显然考虑一下对a+b做除法,一次跳过就可以多胜利一次,看最多能抢多少人头

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    #define maxn 1000000
    int r[maxn],s[maxn],top=0;
    int main()
    {
      int n,a,b,k;
      cin>>n>>a>>b>>k;
      for(int i=1;i<=n;++i)
      {
        cin>>r[i];
        r[i]%=a+b;
      }
      int cnt=0,ans=0;
      for(int i=1;i<=n;++i)
        if(r[i]>a||r[i]==0)
        {
          if(r[i]==0)s[++top]=b%a==0?(b/a):(b/a)+1;
          else s[++top]=r[i]%a==0?(r[i]/a)-1:r[i]/a;
        }
      else ans++;
      sort(s+1,s+1+top);
      for(int i=1;i<=top;++i)
      {
        if(k>=s[i])k-=s[i],ans++;
        else break;
      }
      cout<<ans<<endl;
    }
    

    E1

    暴力

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
     
    using namespace std;
     
    string s;
    
    int f[210],int n;
    
    bool flag;
    
    int main()
    {
      cin>>n>>s;
      f[0]=1;
      for(int i=1;i<n;i++)
      {
        f[i]=1;
        for(int j=0;j<i;j++)if(s[j]>s[i]) f[i]=max(f[i],f[j]+1);
        if(f[i]>2)
        {
          flag=true;
          break;
        }   
      }
      if(flag)
      {
        cout<<"NO"<<endl;
        return 0;
      }
      cout << "YES" <<  endl;
      for(int i=0;i<n;i++)cout<<f[i]-1;
      cout<<endl;
    }
    

    E2

  • 相关阅读:
    P1410 子序列
    P1395 会议 (树形dp)
    P2580 于是他错误的点名开始了
    LC1127. 用户购买平台
    LC 1308. Running Total for Different Genders
    P1340 兽径管理 (最小生成树)
    P1330 封锁阳光大学 (二分图染色)
    CF1296F Berland Beauty (Tree, dfs/bfs, LCA)
    顺丰的Cookie条款
    服务器判断客户端的用户名和密码(token的身份验证)
  • 原文地址:https://www.cnblogs.com/zzqdeco/p/12856936.html
Copyright © 2011-2022 走看看