码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #436 (Div. 2)

时间:2017-09-26 17:48:47      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:index   最小   color   else   deb   clear   价值   make   字符   

 

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

 

Codeforces Round #436 (Div. 2)

标签:index   最小   color   else   deb   clear   价值   make   字符   

原文地址:http://www.cnblogs.com/acjiumeng/p/7597616.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!