Educational Codeforces Round 42 (Rated for Div. 2) A~D

A.Equator 

题意

一串数列,到第几个数为止,使得前面的数的总和大于等于全部总和的一半。很简单,只要注意精度问题,不要用前面的求和大于等于总和的一半,而应该是前面的求和的2倍大于等于总和来算。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<cmath>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof a)
#define mal(a,b) a=(b*)malloc(sizeof(b))
#define st std::ios::sync_with_stdio(false);
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
const double e=1e-8;
ll a[2*maxn];
int main(){
    int n;
    cin>>n;
    ll all=0;
    for(int i=0;i<n;i++){
        scanf("%I64d",&a[i]);
        all+=a[i];
    }
    ll x=0;
    for(int i=0;i<n;i++){
        x+=a[i];
        if(2*x>=all){
            cout<<i+1<<endl;
            break;
        }
    }
}

B. Students in Railway Carriage

题意

给出一排座位和队伍a,队伍b的数量。座位本身有可坐与不可坐的。然后让我们分配a,b的座位。条件是a,b不能相邻坐着。问能坐的最大数量。

思路

我看到很多人都上了什么贪心啊,什么差值比较比较什么的,就我看来在数据范围可以接受的情况下,没有必要那样去做,对于各种特殊情况都要去考虑,反而加大难度。可以直接模拟。做2个判断值p1,p2来表示能不能坐a,b。唯一要思考的是对于a,b都能坐的位置应该坐谁?坐数量大的那个。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<cmath>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof a)
#define mal(a,b) a=(b*)malloc(sizeof(b))
#define st std::ios::sync_with_stdio(false);
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
const double e=1e-8;
char ch[2*maxn];
int main(){
    int n;
    int a,b;
    scanf("%d %d %d",&n,&a,&b);
    char c;
    getchar();
    for(int i=0;i<n;i++){
        scanf("%c",&c);
        ch[i]=c;
    }
    int p1=1,p2=1;
    int ans=0;
    for(int i=0;i<n;i++){
        if(ch[i]=='.'){
            if(p1==1&&p2==1){
                if(a>=b&&a>0){
                    a--;
                    ans++;
                    p1=0;
                }else if(b>a&&b>0){
                    b--;
                    ans++;
                    p2=0;
                }
            }else if(p1==1&&a>0){
                a--;
                ans++;
                p1=0;
                p2=1;
            }else if(p2==1&&b>0){
                b--;
                ans++;
                p1=1;
                p2=0;
            }else{
                p1=1;
                p2=1;
            }
        }else{
            p1=1;
            p2=1;
        }
    }
    cout<<ans<<endl;
}

C. Make a Square

题意

给一个数,去掉几个数字后他应当变成一个没有前导0的平方数。求一个最小的去掉的数字个数。如果不可能输出-1

思路

很明显,对于每个位置,我们可以取1或0,来表说这个位置留下了还是去掉了。然后检验是不是平方数,以及保留最小去掉的数目就可以了。注意的是对于每个位置取值我写了10个for循环(菜鸡是这样的)。但实际上我们可以这样认为,不是要考虑1或0吗?我们看成2进制,len作为数的位数。那么是不是i做一个0~2^len的循环?然后i转换成2进制来判断每一位上是0还是1,就可以了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<cmath>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof a)
#define mal(a,b) a=(b*)malloc(sizeof(b))
#define st std::ios::sync_with_stdio(false);
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
const double e=1e-8;
ll ans[maxn];
int a[10];
int main(){
    for(ll i=1;i<=maxn;i++){
        ans[i]=i*i;
    }
    ll n;
    scanf("%I64d",&n);
    int len=0;
    ll nn=n;
    while(nn>0){
        a[len]=nn%10;
        nn/=10;
        len++;
    }
    int num=maxn;
    int b[10];
    for(b[0]=0;b[0]<=1;b[0]++){
        for(b[1]=0;b[1]<=1;b[1]++){
            for(b[2]=0;b[2]<=1;b[2]++){
                for(b[3]=0;b[3]<=1;b[3]++){
                    for(b[4]=0;b[4]<=1;b[4]++){
                        for(b[5]=0;b[5]<=1;b[5]++){
                            for(b[6]=0;b[6]<=1;b[6]++){
                                for(b[7]=0;b[7]<=1;b[7]++){
                                    for(b[8]=0;b[8]<=1;b[8]++){
                                        for(b[9]=0;b[9]<=1;b[9]++){
                                            ll bb=0;
                                            int y=0;
                                            int flag=1;
                                            for(int k=len-1;k>=0;k--){
                                                if(bb==0&&b[k]!=0&&a[k]==0){
                                                    flag=0;
                                                    break;
                                                }
                                                if(b[k]!=0){
                                                    y++;
                                                    bb*=10;
                                                    bb+=a[k];
                                                }
                                            }
                                            if(!flag) continue;
                                            ll z=sqrt(bb);
                                            if(z*z==bb&&z>=1){
                                                num=min(num,len-y);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if(num!=maxn)cout<<num<<endl;
    else cout<<-1<<endl;
}

D. Merge Equals

题意

给了一串数字。从最小的开始,合并从前往后读到的2个相同的数字,后一个数字变成2倍,前一个数字删去。问最后合并完是什么样子的。

思路

其实很简单的,或者说,根本不用管是不是从最小的开始。然后又用优先队列的。的确优先队列比较快是简单。但是我当时没有想到。。。。直接vector和map操作。输入数组ary[n]。首先因为数字很大,vector数组开不过来我用了map映射。然后对于操作。我从i=0开始读数,然后把i压入到vec[ary[i]]。然后每次压入判断该容器的大小是不是等于2了,如果是的那么读取容器里面的第一个和第二个数字,即是他们所在 的位置,把前面位置上的数字变成0后面的变成原来的2倍。清空容器,然后把第二个数字压入到vec[ary[i]*2]的位置中去,判断这个容器是不是==2,直到把整个数组处理完成,读入下一个ary[i+1]。注意若是用map这边很多都是不能这样写的,要做转换,不是单纯的ary[i]*2,但是为了方便理解故如此。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<cmath>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof a)
#define mal(a,b) a=(b*)malloc(sizeof(b))
#define st std::ios::sync_with_stdio(false);
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
const double e=1e-8;
ll a[2*maxn];
ll b[2*maxn];
vector<ll> vec[2*maxn];
map<ll,ll>m;
map<ll,ll>pm;
int main(){
    int n;
    cin>>n;
    int nn=n;
    ll num=1;
    for(int i=0;i<n;i++){
        scanf("%I64d",&a[i]);
        if(m[a[i]]==0){
            m[a[i]]=num;
            pm[num]=a[i];
            num++;
        }
    }
    int len;
    for(int i=0;i<2*maxn;i++) vec[i].clear();
    for(int i=0;i<n;i++){
        int k=m[a[i]];
        b[i]=a[i];
        vec[k].push_back(i);
        int kk=vec[k].size();
        while(kk>=2){
            ll weizhi=vec[k][0];
            ll wz=vec[k][1];
            b[vec[k][1]]=pm[k]*2;
            b[weizhi]=0;
            vec[k].clear();
            if(m[pm[k]*2]==0){
                m[pm[k]*2]=num;
                pm[num]=pm[k]*2;
                num++;
            }
            k=m[pm[k]*2];
            vec[k].push_back(wz);
            kk=vec[k].size();
        }
    }
    len=0;
    for(int i=0;i<n;i++){
        if(b[i]!=0){
            a[len++]=b[i];
        }
    }
    printf("%d\n",len);
    for(int i=0;i<len;i++){
        if(i>0) printf(" ");
        printf("%I64d",a[i]);
    }
    printf("\n");
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值