Codeforces Round #587 (Div. 3) A B C D F

变化最小的字符,只有a b,a-b可互换,问换最小的位置使得偶数前缀里a-b数量同。

判断每一个偶数位置上及其前面一个位置上即可。

#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>�������� //������
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <stdexcept>������ //��׼�쳣��
#include <streambuf>������//�ײ����룯���֧��
#include <string>����������//�ַ�����
#include <utility>�������� //STLͨ��ģ����
#include <vector>����������//STL��̬��������
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 200000+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
char ch[maxn];
char ch1[maxn];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        scanf("%s",ch+1);
        int ans=0;
        rep(i,1,n)
        {
            if(i%2==0)
            {
                if(ch[i]==ch[i-1])
                {
                    ans++;
                    if(ch[i-1]=='a')
                    {
                        ch1[i-1]='a';
                        ch1[i]='b';
                    }
                    else
                    {
                        ch1[i-1]='b';
                        ch1[i]='a';
                    }
                }else
                {
                    ch1[i]=ch[i];
                    ch1[i-1]=ch[i-1];
                }
            }
        }
        printf("%d\n",ans);
        rep(i,1,n)
        {
            printf("%c",ch1[i]);
        }
        printf("\n");
    }
}

B

给出一组数,求ai*x+1的最小值,x是选ai之前已经选择的个数。

从大到小排序即可。

#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>�������� //������
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <stdexcept>������ //��׼�쳣��
#include <streambuf>������//�ײ����룯���֧��
#include <string>����������//�ַ�����
#include <utility>�������� //STLͨ��ģ����
#include <vector>����������//STL��̬��������
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 2500+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
struct node
{
    int v;
    int id;
}a[maxn];
bool cmp(node a,node b)
{
    return a.v>b.v;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        rep(i,1,n)
        {
            scanf("%d",&a[i].v);
            a[i].id=i;
        }
        sort(a+1,a+1+n,cmp);
        ll ans=0;
        ll s=0;
        rep(i,1,n)
        {
            ans+=s*a[i].v+1;
            s+=1;
            //printf("%d%c",a[i].id,i==n?'\n':' ');
        }
        printf("%lld\n",ans);
        rep(i,1,n)
        {
            printf("%d%c",a[i].id,i==n?'\n':' ');
        }
    }
    return 0;
}

C

给出一个白色长方形,两个黑色的,他们的左下、右上顶点坐标,问黑的覆盖了白色的没有。

对于白色,对于每一个xi x1<=xi<=x2,判断横纵坐标是否在黑色的之间,再判断y坐标。

完全覆盖输出NO

#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <string>����������//�ַ�����
#include <vector>����������//STL��̬��������
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 1000000+66;
const int maxm=100000+66;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
double x1,x2,x3,x4,x5,x6;
double y1,y2,y3,y4,y5,y6;
bool ok1(double x,double y)
{
    return (x>=x3&&x<=x4&&y>=y3&&y<=y4);
}
bool ok2(double x,double y)
{
    return (x>=x5&&x<=x6&&y>=y5&&y<=y6);
}
int main()
{
    while(scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=EOF)
    {
        scanf("%lf %lf %lf %lf",&x3,&y3,&x4,&y4);
        scanf("%lf %lf %lf %lf",&x5,&y5,&x6,&y6);
        bool flag=0;
        for(double i=x1; i<=x2; i+=0.5)
        {
            //(ok1(i,y1)||ok1(i,y2))&&(ok2(i,y1)||ok2(i,y2))
            if(!((ok1(i,y1)||ok2(i,y1))&&(ok1(i,y2)||ok2(i,y2))))
                {
                    flag=1;
                    break;
                }
        }
        for(double i=y1; i<=y2; i+=0.5)
        {
            if(!((ok1(x1,i)||ok2(x1,i))&&(ok1(x2,i)||ok2(x2,i))))//没有被完全覆盖
                 {
                    flag=1;
                    break;
                }
        }
        if(!flag)
            printf("NO\n");
        else
            printf("YES\n");
    }
}

D

给出一个n,以及一组数,代表剩余的量。原来他们的量都为x,现在可能有y人,每个人都会拿走z,可能拿ai,也可能拿aj,z<=x,求最小的y以及z,满足题意。

先求出最大值ax,求ax-ai的差值公约数。

#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>�������� //������
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <stdexcept>������ //��׼�쳣��
#include <streambuf>������//�ײ����룯���֧��
#include <string>����������//�ַ�����
#include <utility>�������� //STLͨ��ģ����
#include <vector>����������//STL��̬��������
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 200500+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
int a[maxn];
ll Gcd(ll x,ll y)
{
    return y==0?x:Gcd(y,x%y);
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int maxx=-1;
        rep(i,1,n)
        {
            scanf("%d",&a[i]);
            maxx=max(maxx,a[i]);
        }
        ll ans=0;//�ҷ�0�������Լ��
        int cnt=0;
        ll gcd=1;
        int flag=0;
        rep(i,1,n)
        {
            ans+=maxx-a[i];
            if(maxx-a[i]!=0&&!flag)
            {
                flag=1;
                gcd=maxx-a[i];
                //gcd=Gcd(gcd,a[i]);
            }
            else if(maxx-a[i]!=0)
            {
                gcd=Gcd(gcd,maxx-a[i]);
            }
        }
        printf("%lld %lld\n",ans/gcd,gcd);
 
 
    }
    return 0;
}

F

给出一些点,每个点需要联网的费用为ai,有些点是路由器,路由器覆盖的范围已经给出,求所有点联网的最小费用。

dp

fi记录的是距离i点 最近的 右边的那个点的标号。

dpi记录的是1-i所用的最小费用。

v=f[max(1,i-k)]   如果v<=min(n,i+k),那么

dp[i]=min(dp[i-1]+i,dp[max(1,v-i)-1)+v])

max(1,v-i)代表v点作用不到的位置,再加上v,就能作用到i-i啦。

#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>�������� //������
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <stdexcept>������ //��׼�쳣��
#include <streambuf>������//�ײ����룯���֧��
#include <string>����������//�ַ�����
#include <utility>�������� //STLͨ��ģ����
#include <vector>����������//STL��̬��������
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 200500+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
int a[maxn];
char ch[maxn];
int f[maxn];
ll dp[maxn];
int main()
{
    int n, k;
    while(scanf("%d %d",&n,&k)!=EOF)
    {
        rep(i,1,n)dp[i]=0;
        scanf("%s",ch+1);
        f[n+1]=3*n+k;
        dep(i,n,1)
        {
            f[i]=ch[i]=='1'?i:f[i+1];
        }
        rep(i,1,n)
        {
            dp[i]=dp[i-1]+i;
            int v=f[max(1,i-k)];
            if(v<=min(n,i+k))
            {
                dp[i]=min(dp[i],dp[max(1,v-k)-1]+v);
            }
        }
        printf("%lld\n",dp[n]);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值