Educational Codeforces Round 179 (Rated for Div. 2)
手速场,切前四题后看表现分2000+且e过的人很少后就开摆了,其实应该能开e的,心态得改一下
A. Energy Crystals
感觉前四题最难的就是A了 找规律打表
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int x;
cin>>x;
int val=63-__builtin_clzll(x);
int ans=val*2+3;
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
return 0;
}
B. Fibonacci Cubes
先判断能不能把最大的放下,再判断能不能把次大的放下。如果都可以,剩下的一定能放下。
因为f[n] = f[n-1] + f[n-2]
如果能放下n,则边长至少是n,再把 n-1 放到 n 上面,如果能放下 n-1 ,则剩下的距离是,f(n) - f(n-1)刚好是f(n-2)
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
int f[14];
void init(){
f[1]=1;
f[2]=2;
for(int i=3;i<=11;i++){
f[i]=f[i-1]+f[i-2];
}
}
void solve(){
int n,m;
cin>>n>>m;
while(m--){
int a,b,c;
cin>>a>>b>>c;
int mn=min({a,b,c});
int mx=max({a,b,c});
if(mn<f[n]){
cout<<0;
continue;
}
if(mx-f[n]>=f[n-1]){
cout<<1;
}
else{
cout<<0;
}
}
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
init();
int ct=1;
cin>>ct;
while(ct--){
solve();
}
return 0;
}
C. Equal Values
枚举每个位置的值,让这个位置的值填充整个数组的代价是多少,重点是如果有连续一段相同的数该怎么处理
只要处理出连续一段相同的数的起点和终点l,r即可,答案为 (l-1)a[i] + (n-r)a[i]
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n;
cin>>n;
vector<int> a(n+10),ne(n+10);
bool f=1;
for(int i=1;i<=n;i++){
cin>>a[i];
if(i!=1 && a[i]!=a[i-1]) f=0;
ne[i]=i;
}
if(f){
cout<<0<<endl;
return;
}
int now=1;
for(int i=2;i<=n;i++){
if(a[i]==a[now]){
ne[now]=i;
}
else{
now=i;
}
}
int ans=inf;
for(int i=1;i<=n;i++){
int val=a[i]*(i-1+n-ne[i]);
ans=min(ans,val);
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
return 0;
}
D. Creating a Schedule
对序列排序后,显然对一个班级,最优的选法是选择第一个和最后一个。
所以,可以让两个班级,轮流在第一个和最后一个教室上课。
再让另外两个班级,轮流做第二个和倒数第二个教室上课。
以此类推,这样能保证距离最远的两个教室一直被占用,使得最后结果最优
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n,m;
cin>>n>>m;
vector<int> a(m+1);
for(int i=1;i<=m;i++){
cin>>a[i];
}
sort(a.begin()+1,a.end());
int l=1,r=m;
for(int i=1;i<=n;i++){
for(int j=1;j<=3;j++){
if(i&1) cout<<a[l]<<" "<<a[r]<<" ";
else cout<<a[r]<<" "<<a[l]<<" ";
}
cout<<endl;
if((i&1)==0) l++,r--;
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
return 0;
}
E. Changing the String
其实这题不难,纯贪心
先把q次操作全部读入,用 set 存起来
从前往后遍历字符串,遇到a就跳过
遇到 b 先尝试能不能直接变成a,再尝试能不能 b->c ,c->a ( 需要保证b->c 的操作时间在 c->a 前面,这一步可以用set的lower_bound找)
遇到 c 先尝试能不能 c->a, 在尝试能不能 c->b->a, 在尝试能不能 c->b
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n,q;
cin>>n>>q;
string s;
cin>>s;
s=" "+s;
vector<vector<set<int>>> st(3,vector<set<int>>(3));
for(int i=1;i<=q;i++){
char a,b;
cin>>a>>b;
st[a-'a'][b-'a'].insert(i);
}
for(int i=1;i<=n;i++){
if(s[i]=='a') continue;
if(s[i]=='b'){
//1. b->a
if(st[1][0].size()){
auto it=st[1][0].begin();
st[1][0].erase(it);
s[i]='a';
}
else{
//2. try b->c, c->a
if(st[1][2].size()){
auto it1=st[1][2].begin();
int idx=*it1;
auto it2=st[2][0].lower_bound(idx);
if(it2==st[2][0].end()) continue;
s[i]='a';
st[1][2].erase(it1);
st[2][0].erase(it2);
}
}
}
else if(s[i]=='c'){
//1. c->a
if(st[2][0].size()){
auto it=st[2][0].begin();
st[2][0].erase(it);
s[i]='a';
}
else if(st[2][1].size()){
//1. c->b
auto it1=st[2][1].begin();
int idx=*it1;
st[2][1].erase(it1);
s[i]='b';
//3. c->b->a
auto it2=st[1][0].lower_bound(idx);
if(it2!=st[1][0].end()){
st[1][0].erase(it2);
s[i]='a';
}
}
}
}
for(int i=1;i<=n;i++){
cout<<s[i];
}
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
return 0;
}

浙公网安备 33010602011771号