CodeCraft-19 and Codeforces Round #537 (Div. 2) A, B, C

末鹿安然 提交于 2019-12-01 03:47:38

CodeCraft-19 and Codeforces Round #537 (Div. 2) A, B, C


A. Superhero Transformation

题目链接
题面:

划掉

题意:

见题面

思路:

将元音字母转换为*,辅音字母转换为+,判断最后两个字符串是否相同即可。

AC代码:
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <stack>
#include <bitset>

using namespace std;

#define FSIO  ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define DEBUG(a)   cout<<"DEBUG: "<<(a)<<endl;
#define ll long long
#define ull unsigned long long
#define ld long double
#define pb push_back
#define MP make_pair
#define X  first
#define Y  second
#define REP(i,st,ed)    for(int i=st;i<=ed;++i)
#define IREP(i,st,ed)   for(int i=st;i>=ed;--i)
#define TCASE(T)    cin>>T;while(T--)

const int MAXN = 200005;
const ll MOD = 1e9+7 ;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int INF = 1e9+7;
const double PI = acos(-1.0);
const double EPS = 1e-8;

int _;

using namespace std;



int main()
{
    //freopen("test.in","r+",stdin);
    //freopen("test.out","w+",stdout);
    FSIO;
    string S, T;
    while(cin>>S>>T)
    {

        for(int i=0;i<S.length();++i)
        {
            char c= S[i];
            if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u')
                S[i]='*';
            else    S[i]='+';
        }
        for(int i=0;i<T.length();++i)
        {
            char c= T[i];
            if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u')
                T[i]='*';
            else    T[i]='+';
        }
        //cout<<S<<" "<<T<<endl;
        if(S==T)    cout<<"Yes"<<endl;
        else    cout<<"No"<<endl;
    }
    return 0;
}

B. Average Superhero Gang Power

题目链接
题面:

划掉

题意:

nn个英雄,每个人拥有 a1,a2,...,ana_1, a_2, ... , a_n的能量,让你进行m次操作:

  • 去掉某个英雄
  • 给某个英雄能量加11
    注意每个英雄最多加kk次能量

问按上述操作,最后英雄的平均能量的最大值。

思路:

贪心。
从前往后,考虑首先去掉ii个英雄,剩下能加上的能量为min(mi,(ni)k)min(m-i,(n-i)*k)
O(n)O(n)扫一遍即可。

AC代码:
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <stack>
#include <bitset>

using namespace std;

#define FSIO  ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define DEBUG(a)   cout<<"DEBUG: "<<(a)<<endl;
#define ll long long
#define ull unsigned long long
#define ld long double
#define pb push_back
#define MP make_pair
#define X  first
#define Y  second
#define REP(i,st,ed)    for(int i=st;i<=ed;++i)
#define IREP(i,st,ed)   for(int i=st;i>=ed;--i)
#define TCASE(T)    cin>>T;while(T--)

const int MAXN = 100005;
const ll MOD = 1e9+7 ;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int INF = 1e9+7;
const double PI = acos(-1.0);
const double EPS = 1e-8;

int _;

using namespace std;

int power[MAXN];
int N, K, M;

int main()
{
    //freopen("test.in","r+",stdin);
    //freopen("test.out","w+",stdout);
    FSIO;
    cout<<setprecision(10);
    cout<<fixed;
    while(cin>>N>>K>>M)
    {
        REP(i,1,N)  cin>>power[i];
        sort(power+1,power+1+N);
        ll summ = 0;
        REP(i,1,N)  summ+=power[i];
        double res = (double)summ/N;
        REP(i,0,N-1)
        {
            if(M-i<0)   break;
            summ -= power[i];
            ll togo = min(1LL*(N-i)*K,1LL*(M-i));
            res = max(res,(double)(togo+summ)/(N-i));
        }
        cout<<res<<endl;
    }
    return 0;
}

C. Creative Snap

题目链接
题面:

划掉

题意:

有一排敌人的基地,长度为1&lt;&lt;n1&lt;&lt;n,还有k个敌人,每个敌人仅且仅在一个基地。
现在让你来消灭这些基地,每次你能进行的有两种操作:

  • 将你要消灭的基地对半分(保证长度2\geq 2)
  • 消灭一段基地,如果没有敌人,则消耗AA能量,否则消耗BB*敌人数量*基地长度能量。

问你消灭这排基地所需最小能量。

思路:

DFS
每次要消灭lrl到r这段基地时,
首先使用二分前缀和求出基地敌人数量,

  • 如果为0,那么消灭这排基地所需最小能量为AA
  • 否则,求出当前消灭这排基地所需能量值,与dfs(l,mid)+dfs(mid+1,r)dfs(l,mid)+dfs(mid+1,r)取最小值
    注意当敌人数量为0时,直接返回
AC代码:
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <stack>
#include <bitset>

using namespace std;

#define FSIO  ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define DEBUG(a)   cout<<"DEBUG: "<<(a)<<endl;
#define ll long long
#define ull unsigned long long
#define ld long double
#define pb push_back
#define MP make_pair
#define X  first
#define Y  second
#define REP(i,st,ed)    for(int i=st;i<=ed;++i)
#define IREP(i,st,ed)   for(int i=st;i>=ed;--i)
#define TCASE(T)    cin>>T;while(T--)

const int MAXN = 100005;
const ll MOD = 1e9+7 ;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int INF = 1e9+7;
const double PI = acos(-1.0);
const double EPS = 1e-8;

int _;

using namespace std;

int position[MAXN];
int N, K, A, B;

int cnt_avengers(int l, int r)
{
    l = lower_bound(position+1,position+1+K,l)-position;
    r = upper_bound(position+1,position+1+K,r)-position-1;
    return max(0,r-l+1);
}

ll rua(int l, int r)
{
    int num_ave = cnt_avengers(l,r);
    ll base = 1LL*num_ave*B*(r-l+1)+(num_ave==0)*A;

    if(r-l+1<2||num_ave==0) return base;
    int mid = (l+r)>>1;
    base = min(base,rua(l,mid)+rua(mid+1,r));
    return base;
}

int main()
{
    //freopen("test.in","r+",stdin);
    //freopen("test.out","w+",stdout);
    FSIO;
    while(cin>>N>>K>>A>>B)
    {
        REP(i,1,K)  cin>>position[i];
        sort(position+1,position+1+K);
        cout<<rua(1,1<<N)<<endl;
    }
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!