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
题目链接
题面:
划掉
题意:
有 n n n个英雄,每个人拥有 a 1 , a 2 , . . . , a n a_1, a_2, ... , a_n a1,a2,...,an的能量,让你进行m次操作:
- 去掉某个英雄
- 给某个英雄能量加
1
1
1
注意每个英雄最多加 k k k次能量
问按上述操作,最后英雄的平均能量的最大值。
思路:
贪心。
从前往后,考虑首先去掉
i
i
i个英雄,剩下能加上的能量为
m
i
n
(
m
−
i
,
(
n
−
i
)
∗
k
)
min(m-i,(n-i)*k)
min(m−i,(n−i)∗k)。
O
(
n
)
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
<
<
n
1<<n
1<<n,还有k个敌人,每个敌人仅且仅在一个基地。
现在让你来消灭这些基地,每次你能进行的有两种操作:
- 将你要消灭的基地对半分(保证长度 ≥ 2 \geq 2 ≥2)
- 消灭一段基地,如果没有敌人,则消耗 A A A能量,否则消耗 B ∗ 敌 人 数 量 ∗ 基 地 长 度 B*敌人数量*基地长度 B∗敌人数量∗基地长度能量。
问你消灭这排基地所需最小能量。
思路:
DFS
每次要消灭
l
到
r
l到r
l到r这段基地时,
首先使用二分前缀和求出基地敌人数量,
- 如果为0,那么消灭这排基地所需最小能量为 A A A
- 否则,求出当前消灭这排基地所需能量值,与
d
f
s
(
l
,
m
i
d
)
+
d
f
s
(
m
i
d
+
1
,
r
)
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;
}