Educational Codeforces Round 145 (Rated for Div. 2) A-D

比赛链接:Dashboard - Educational Codeforces Round 145 (Rated for Div. 2) - Codeforces

A:结论题

题意:给你 4 个拥有颜色的灯,你可关闭或打开这个灯当且仅当你上次关闭或打开的灯的颜色与当前灯的颜色不同,问将其都打开的操作次数。 

分析:手撸样例直接得结论

1:如果是四盏颜色相同的等,输出-1

2:如果相同颜色的灯的个数为3,则需要操作6次

3:否则操作4次

代码:

#include <bits/stdc++.h>
#define pi acos(-1)
#define int long long
#define PII pair<int,int>
#define all(v) v.begin(),v.end()
#define INF 0x3f3f3f3f3f3f3f3f
#define fs(a) cout<<fixed<<setprecision(a)<< //fs(4)(1.0/3)=0.3333//保留a位小数
#define read() freopen("input.txt","r",stdin)
#define output() freopen("output.txt","w",stdout)
#define fast ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=2e5+10;
const int mod = 1e9+7;
const int Mod = 998244353;
int lowbit(int x){return x&(-x);}
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}//       a/b向上取整
int quickpow(int a,int n){int ans=1;while(n){if(n&1){ans*=a,ans%=Mod;}a*=a;a%=Mod;n>>=1;}return ans;}//快速幂
int qc(int a,int b,int p){int ans=0;while(b){if(b&1){ans+=a,ans%=p;}a*=2;a%=p;b>>=1;}return ans;}//快速乘 a*b%p

inline void solve(){
	string s;cin>>s;
	map<char,int>mp;int cnt=0;
	for(int i=0;i<s.size();i++) mp[s[i]]++,cnt=max(cnt,mp[s[i]]);
	if(cnt==s.size()){
		cout<<"-1\n";return;
	} 
	if(cnt==3){
		cout<<"6\n";return;
	}
	cout<<"4\n";
}
	
signed main(){
	fast;int T;cin>>T;
	while(T--) solve();
}              

B:思维(规律)

题意:给定个n个点,叫你在直角坐标系中放置点位,使其各个点之间的距离大于1,且每个点对答案的影响为|x|+|y|。求最小的ans.(ans=max((|x_{1}]+|y_{1}),....,(|x_{n}|+|y_{n}|))

分析:我们发现,如果需要放置2个点,放在边长为1的正方形的对角线位置,所得的距离为根号2是大于1的。然后根据这个思想,可以绘制一张图得到一个规律。在平面中放n个点 (xi,yi) ,使得任意两个点之间的欧式距离大于1 ,其放置一个点的代价是 |xi|+|yi| ,求一种代价最小的放法并输出这个价值

图解:

结论:n是平方数,就是sqrt(n)-1.else sqtr(n)

代码:

#include <bits/stdc++.h>
#define pi acos(-1)
#define int long long
#define PII pair<int,int>
#define all(v) v.begin(),v.end()
#define INF 0x3f3f3f3f3f3f3f3f
#define fs(a) cout<<fixed<<setprecision(a)<< //fs(4)(1.0/3)=0.3333//保留a位小数
#define read() freopen("input.txt","r",stdin)
#define output() freopen("output.txt","w",stdout)
#define fast ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=2e5+10;
const int mod = 1e9+7;
const int Mod = 998244353;
int lowbit(int x){return x&(-x);}
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}//       a/b向上取整
int quickpow(int a,int n){int ans=1;while(n){if(n&1){ans*=a,ans%=Mod;}a*=a;a%=Mod;n>>=1;}return ans;}//快速幂
int qc(int a,int b,int p){int ans=0;while(b){if(b&1){ans+=a,ans%=p;}a*=2;a%=p;b>>=1;}return ans;}//快速乘 a*b%p

inline void solve(){
	int n;cin>>n;
	int ans=0,m=sqrt(n);
	if(m*m==n) cout<<m-1<<"\n"; else cout<<m<<"\n";
}
	
signed main(){
	fast;int T;cin>>T;
	while(T--) solve();
}              

C:构造

题意:构造一个长度为N,恰好有k个子序列的元素和为正数,其余的子序列元素之和为负数的整数序列

分析:

思路:放连续x个正数后,再放连续y个负数,使其满足条件。

解释:我们发现,N个连续的正数,其能产生\frac{n\cdot (n+1)}{2}个正和序列。这里所采用的构造方法很有意思。我们找到一个最大X,因为连续x个正数能够产生M=\frac{x\cdot (x+1)}{2}个正和序列。当M\leq K时,我们找到了最大的X。因此,我们放置x个连续的正数。(这里正数任取,都放相同的正数最简单)。再放N-X个负数

1:K=M,那么就放X个正数即可

2:否则就考虑放负数的情况。

2--->:我们令Q=K-M,为还需要补充的正数和序列的个数(就是放置X个正数后,放完了负数,如何调整使得再多产生Q个正数序列)。

构造方法(图解):

为什么?我们将第一个负数调小,将第 k 个正数调大即可(这里可能有点难懂,别急,接着往下看)

 ps:C题是一道非常有意思的构造,其思维很奇特,建议读者细品。

 D:贪心

题意:给定一个 01 串,进行交换 01 操作或删除操作,使串变为不存在递减的串交换花费 10^12,删除花费 10^12+1,求最小花费。

分析:贪心策略。挺容易想到的。

答案肯定行如左半部分全为 0,右半部分全为 1。

我们可以枚举 0,1 的分界点,那么此时将分界点以左的 1 全部删去,以右的 0 全部删去。

此时,若 1,0 与分界点相邻可以省去两次删除操作,使用交换操作。

因此,预处理前缀 1 的个数,与后缀 0 的个数,随后枚举即可。

代码:

#include <bits/stdc++.h>
#define pi acos(-1)
#define int long long
#define PII pair<int,int>
#define all(v) v.begin(),v.end()
#define INF 0x3f3f3f3f3f3f3f3f
#define fs(a) cout<<fixed<<setprecision(a)<< //fs(4)(1.0/3)=0.3333//保留a位小数
#define read() freopen("input.txt","r",stdin)
#define output() freopen("output.txt","w",stdout)
#define fast ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=2e5+10;
const int mod = 1e9+7;
const int Mod = 998244353;
int lowbit(int x){return x&(-x);}
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}//       a/b向上取整
int quickpow(int a,int n){int ans=1;while(n){if(n&1){ans*=a,ans%=Mod;}a*=a;a%=Mod;n>>=1;}return ans;}//快速幂
int qc(int a,int b,int p){int ans=0;while(b){if(b&1){ans+=a,ans%=p;}a*=2;a%=p;b>>=1;}return ans;}//快速乘 a*b%p

inline void solve(){
	string s;cin>>s;
	map<int,int>pre,ne;
	for(int i=0;i<s.size();i++){
		pre[i]=pre[i-1];
		if(s[i]=='1') pre[i]++;
	}
	for(int i=s.size()-1;i>=0;i--){
		ne[i]=ne[i+1];
		if(s[i]=='0') ne[i]++;
	}
	int ans=INF;
	for(int i=0;i<=s.size();i++){
		int change=pre[i-1]+ne[i];
		ans=min(ans,change*(int)(1e12+1));
		if(i!=0&&i!=s.size()){
			if(s[i]=='0'&&s[i-1]=='1') ans=min(ans,(change-2)*(int)(1e12+1)+(int)1e12);
		}
	}
	cout<<ans<<"\n";
} 
	
signed main(){
	fast;int T;cin>>T;
	while(T--) solve();
}              

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值