zoukankan      html  css  js  c++  java
  • Codeforces Round #436 (Div. 2)

    A:n个数,看能不能找出只有两种数,而且数量相同

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=1000+10,maxn=60000+10,inf=0x3f3f3f;
    
    inline void debug(){cout<<"fuck"<<endl;}
    
    map<int,int>m;
    int a[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            m[a[i]]++;
        }
        sort(a,a+n);
        if(m.size()!=2)cout<<"NO"<<endl;
        else
        {
            if(m[a[0]]==m[a[n-1]])cout<<"YES"<<endl<<a[0]<<" "<<a[n-1]<<endl;
            else cout<<"NO"<<endl;
        }
        return 0;
    }
    /********************
    
    ********************/
    A

    B:一个字符串,找最长连续的小写字母里面的小写字母种数,暴力查找

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=1000+10,maxn=60000+10,inf=0x3f3f3f;
    
    inline void debug(){cout<<"fuck"<<endl;}
    
    map<char,int>m;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        string s;
        cin>>n>>s;
        int ans=0;
        for(int i=0;i<s.size();i++)
        {
            m.clear();
            for(int j=i;j<s.size();j++)
            {
                if('A'<=s[j]&&s[j]<='Z')break;
                m[s[j]]++;
            }
            ans=max(ans,(int)m.size());
        }
        cout<<ans<<endl;
        return 0;
    }
    /********************
    
    ********************/
    B

    C:sb模拟题,边界情况没考虑,我的做法要特判k==1的情况,每次更新到下一个加油站,看能不能不加油

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=1000+10,maxn=60000+10,inf=0x3f3f3f;
    
    inline void debug(){cout<<"fuck"<<endl;}
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        ll a,b,f,k;
        cin>>a>>b>>f>>k;
        if(k==1&&(b<f||b<a-f))
        {
            cout<<-1<<endl;
            return 0;
        }
        ll ans=0,now=b-f;
        if(now<0)
        {
            cout<<-1<<endl;
            return 0;
        }
        for(int i=1;i<k;i++)
        {
            if(i%2==1)
            {
                if(now<2*(a-f))now=b,ans++;
                now-=2*(a-f);
            }
            else
            {
                if(now<2*f)now=b,ans++;
                now-=2*f;
            }
            if(now<0)
            {
                cout<<-1<<endl;
                return 0;
            }
        }
        if(k%2==1)
        {
            if(now<a-f)ans++;
        }
        else
        {
            if(now<f)ans++;
        }
        cout<<ans<<endl;
        return 0;
    }
    /********************
    
    ********************/
    C

    D:找改变次数最小且字典序最小的置换,先记录所有的没有出现过的加入队列,循环,对于某一个点(有多个没有改变的)如果还没有确定的点,而且它的值小于队列头的值,那么把它确定下来,否则就给他赋值,可以保证最后结果字典序最小

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=200000+10,maxn=60000+10,inf=0x3f3f3f;
    
    int num[N],a[N];
    bool vis[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,ans=0;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            num[a[i]]++;
        }
        queue<int>q;
        for(int i=1;i<=n;i++)
            if(!num[i])
                q.push(i);
        memset(vis,0,sizeof vis);
        for(int i=1;i<=n;i++)
        {
            if(num[a[i]]>1)
            {
                if(!vis[a[i]]&&a[i]<q.front())
                {
                    vis[a[i]]=1;
                }
                else
                {
                    ans++;
                    num[a[i]]--;
                    a[i]=q.front();
                    q.pop();
                }
            }
        }
        cout<<ans<<endl;
        for(int i=1;i<=n;i++)
            cout<<a[i]<<" ";
        cout<<endl;
        return 0;
    }
    /********************
    
    ********************/
    D

    E:对于这一题,可以先想到怎么求最大的价值,先对结束时间排序,然后dp扫一遍,不是多重背包,所以从后往前扫。

    记录路径可以用一个二维数组,所有挑选的位置就定义为true,对于找出最后的答案,可以从后往前扫求出最大的那一个标号id,然后每次找到id对应的i时就改变id,使它跳转到上一个更新的路径,然后不断放入栈中,最后输出

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=100+10,maxn=2000+10,inf=0x3f3f3f;
    
    struct item{
        int savetime,burntime,value;
        int index;
    }a[N];
    int dp[maxn];
    bool pre[N][maxn];
    bool comp(item a,item b)
    {
        return a.burntime<b.burntime;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i].savetime>>a[i].burntime>>a[i].value;
            a[i].index=i;
        }
        sort(a+1,a+1+n,comp);
        memset(dp,0,sizeof dp);
        for(int i=1;i<=n;i++)
        {
            for(int j=a[i].burntime-1;j>=a[i].savetime;j--)
            {
                if(dp[j]<dp[j-a[i].savetime]+a[i].value)
                {
                    dp[j]=dp[j-a[i].savetime]+a[i].value;
                    pre[i][j]=1;
                }
            }
        }
        int ans=-1,id=0;
        for(int i=0;i<=2000;i++)
        {
            if(ans<dp[i])
            {
                ans=dp[i];
                id=i;
            }
        }
        cout<<ans<<endl;
        stack<int>s;
        for(int i=n;i>=1;i--)
        {
            if(pre[i][id])
            {
                id-=a[i].savetime;
                s.push(a[i].index);
            }
        }
        cout<<s.size()<<endl;
        while(!s.empty())
        {
            cout<<s.top()<<" ";
            s.pop();
        }
        cout<<endl;
        return 0;
    }
    /********************
    5
    12 1 17
    10 1 11
    16 4 50
    17 5 5
    6 1 2
    dp[j]=max(dp[j-1],dp[j-a[i].savetime]+a[i].value)
    ********************/
    E
  • 相关阅读:
    盒子模型2+浮动
    盒子模型
    CSS背景和精灵图
    线程间的通信的实现
    操作系统中线程与进程
    java中的互斥锁和信号量的区别
    Java中的常见异常
    JVM面试问题
    软件测试分类
    软件测试
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7597616.html
Copyright © 2011-2022 走看看