首页 > 其他分享 >Educational Codeforces Round 137 (Rated for Div. 2)

Educational Codeforces Round 137 (Rated for Div. 2)

时间:2023-07-16 17:00:37浏览次数:39  
标签:Educational Rated int max t2 Codeforces t1 read p1

Educational Codeforces Round 137 (Rated for Div. 2)

 

A. Password

void solve(){
    int n=read();
    for(int i=1;i<=n;i++)int x=read();
    cout<<combination(10-n,2)*6<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

B. Permutation Value

void solve(){
    int n=read();deque<int>a;
    for(int i=n;i>=1;i--){
        if(i%2==0)a.push_back(i);
        else a.push_front(i);
    }
    for(auto x:a){
        cout<<x<<" ";
    }
    cout<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

C. Save the Magazines

int f[N],a[N];
void solve(){
    int n=read();
    string s;
    cin>>s;
    for(int i=0;i<n;i++){
        a[i]=read();
    }
    memset(f,0 ,sizeof f);
    for(int i=n-1;i>=0;i--){
        if(s[i]=='0')f[i]=max(f[i],f[i+1]);
        else {
            f[i-1]=max({f[i+1]+a[i-1],f[i-1],f[i]+a[i-1]});

            f[i]=max(f[i+1]+a[i],f[i]);
        }
    }
    cout<<f[0]<<'\n';
}

 

D. Problem with Random Tests

题意

选择01字符串的两个字串,让两个字符串二进制或最大,求最大值。题目说明,样例为纯随机字符串。

Tag

暴力枚举+贪心。

解法

对于将要选择的字串命名为a和b,那么令其中一个(不妨令a字串)为s串。因为字串的1所在位置越大,他能构成的异或值也更大。那么此时b字串要做的就是尽量将a串的0变为1。这下找到a串的第一个非前导0的位置,选择一个1填上去,之后比较后续的值是否更大,b字串的长度是 a的长度-没有0出现的最长前缀长。这时候这是一个O(n^2)的算法,但是因为纯随机字符串,假设在第30位才找到第一个0的概率是2的30次方分之一,所以b的长度会接近n。那么对b字串的枚举数就很小,会是一个带较大常数的O(n)算法。

void solve(){
    int n=read(),sb=0,z=-1;
    string s;
    cin>>s;
    for(int i=0;i<n;i++){
        if(s[i]=='1'){
            sb=i;
            break;
        }
    }
    string a,b;
    for(int i=sb;i<n;i++){
        a+=s[i];
        if(s[i]=='0'&&z==-1){
            z=i;
        }
    }
    int la=n-sb;
    int lb=n-z;
    for(int i=0;i<n-lb;i++){
        string tmp;
        if(s[i]==0)continue;
        for(int j=0;j<lb;j++){
            tmp+=max(s[i+j],a[j+z-sb]);
        }
        b=max(b,tmp);
    }
    string ans;
    for(int i=0;i<la-lb;i++){
        ans+=a[i];
    }
    ans+=b;
    int fl=0;
    for(int i=0;i<ans.size();i++){
        if(ans[i]=='1')fl=1;
        if(fl)cout<<ans[i];
    }
    if(fl==0)cout<<0<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

E. FTL

题意

给定两个激光发射器,给定伤害和充电时间,以及怪物的血量,以及每次被攻击的护盾承伤,求击杀怪物的最短时间。

Tag

动态规划

解法

首先发现每一次同时攻击后,两艘飞船都会回到初始状态,所以可以尝试dp找什么时候同时攻击。设f(i)函数表示打出i点伤害的最短时间。

对于状态转移,先考虑最简单的由一个炮打一次就完成,转移方程为f[i]=min(f[max(0,i-p1+s)]+t1,f[max(0,i-p2+s)]+t2)

然后是两个炮互相等待一起进攻状态转移,这样的进攻造成(先假设1号炮自己发射了j次,最后一次两个炮共同发射)damage=(j-1)*(p1-s)+(t1*j-t2)/t2*(p2-s)+p1+p2-s

转移方程为f[i]=min(f[i],f[max(0,i-damage)]+t1*j)

整个算法的复杂度为O(n^2)

#define int long long
int f[N];
void solve(){
    int p1=read(),t1=read(),p2=read(),t2=read(),h=read(),s=read();
    memset(f,inf,sizeof f);
    f[0]=0;
    for(int i=1;i<=h;i++){
        f[i]=min(f[max(0ll,i-(p1-s))]+t1,f[max(0ll,i-(p2-s))]+t2);
        for(int j=1;j<=i;j++) {
            if(t1*j>=t2){ 
                int dmg=(j-1)*(p1-s)+(t1*j-t2)/t2*(p2-s)+p1+p2-s;
                f[i]=min(f[i],f[max(0ll,i-dmg)]+t1*j);
            } 
            if(t2*j>=t1){
                int dmg=(j-1)*(p2-s)+(t2*j-t1)/t1*(p1-s)+p1+p2-s;
                f[i]=min(f[i],f[max(0ll,i-dmg)]+t2*j);
            }
        }
    }
    cout<<f[h]<<endl;
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

标签:Educational,Rated,int,max,t2,Codeforces,t1,read,p1
From: https://www.cnblogs.com/edgrass/p/17558123.html

相关文章

  • Codeforces Round #881 (Div. 3) A-F
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;inta[57];boolsolve(){intn;cin>>n;for(inti=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);intsum=0;for(inti......
  • Codeforces Round 881 (Div. 3) D - Apple Tree(dfs)
    https://codeforces.com/contest/1843/problem/D题目大意:一颗树中,每次给定两个结点,每个结点都可以移动到孩子结点,最后可以到达叶子结点,问我们这两个结点最终移到叶子结点有多少种组合?(其实就是让求以这两个节点为根的子树的叶子结点个数的乘积)input2512345332......
  • Codeforces Round 875 (Div. 2)
    CodeforcesRound875(Div.2)A-TwinPermutations思路:让序列全相等为n+1即可#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;constintN=2e5+5,INF=0x3f3f......
  • Codeforces Round 884 (Div. 1 + Div. 2)
    CodeforcesRound884(Div.1+Div.2) A-SubtractionGame思路:显而易见为a+b#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;c......
  • Codeforces 1396E - Distance Matching
    先考虑一下合法的\(k\)的上界和下界是什么以及如何达到上界和下界,我们找出树的一个重心\(R\)并以\(R\)为根dfs一遍整棵树,那么:下界为\(\sum(siz_i\bmod2)\),构造方法是从下往上钦定,对于一个点考虑其所有没有匹配的儿子,如果是偶数个就将它们两两匹配,如果是奇数个就将它们......
  • Codeforces 1740H - MEX Tree Manipulation
    首先发现一个性质,那就是每个点的点权是\(\logn\)级别的。因为假设要造出一个点权为\(i\)的点至少需要大小为\(mn_i\)的子树,那么显然有\(mn_i=\sum\limits_{j=0}^{i-1}mn_j+1\),即\(mn_i=2^i\)。由于点权不是很大,因此我们很容易地往变换复合的角度思考。将整棵树进行轻重......
  • Codeforces Round #882 (Div. 2) A-D
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;inta[107];intf[107];boolsolve(){intn,k;cin>>n>>k;for(inti=1;i<=n;i++)cin>>a[i];for(inti=1;i<=n-1;......
  • codeforces1283F
    题目链接sol:根一定是第一个,然后不太会,去看了洛谷题解题解#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefpair<int,int>pii;#definefifirst#definesesecond#definefz1(i,n)for((i)=1;(i)<=(n);(i)++)#definefd1(i,n)for((i)......
  • Educational Codeforces Round 151 (Rated for Div. 2)
    D.RatingSystem题目大意玩家的初始积分为0,该玩家连续进行\(n\)场比赛,每场比赛可升高或降低玩家的积分(\(a_i\))。你可以设置一个\(k\)值,比赛过程中玩家的积分不会低于\(k\)(若有一场比赛会使玩家的积分低于\(k\),比赛后玩家的积分会被强制变为\(k\))。找到一个\(k\),使经过\(n\)......
  • codeforces1311E
    题目链接sol:先建一条链,然后把下面的点一个个往上面移,优先移到最上面,如果上面满了就往下一层,知道刚刚好凑满距离,如果最后不能移了就说明不能凑出给定的距离#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefpair<int,int>pii;#definefifir......