Educational Codeforces Round 94(A-C)

Educational Codeforces Round 94 (Rated for Div. 2)

A. String Similarity

问题分析: 给你了相似规则 以及 分段规则

然后 一个数字n,以及2n-1长度的字符串
我们按照分段规则 会发现分段的数量一定是是n ->[2n-(n-1)]
怎么来的呢 :我们看最后一段 一定是 一个头数字+(n-1)个尾数字
呢么头数字的 数量就是 我们分段的 数量也就是 2n-1-(n-1)=n
呢么,问题变成了 找到一个n长度的字符串与n段字符相似
这样按照规则只要保证 答案所求字符串某一位数字 与 某一段相对位置数字相同就行
(第一位数字 == 第一段的第一位数字)

(第 2 位数字 == 第 2 段的第 2 位数字)
. . . . .
而对于所给字符串来说所求字符串的每一位的相对位置
是 1 3 5 7 9 自己举个例子
原因的话 是因为(你每段段首往后移动一位,而你所求相对位置也是往后移动一位,所以 移动间距固定为 2)

AC代码:

#include
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
const ll inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=2e5+10;
int a[1026],flag[1026],book[1026];
int main(){
     
       // #define io
#ifdef io
        freopen("in.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--){
     
	int n;
	cin>>n;
	string s;
	cin>>s;
	for(int i=0;i<2*n;i++){
     
		if(i%2==0){
     
			cout<<s[i];
		}
	}
	cout<<endl;
}
return 0;
}

B. RPG Protagonist

问题分析:题目要求 2个人 2个容量2种武器,嘻嘻——偷最多的武器

暴力枚举 ,,, 自己容纳最多武器并且这个武器所占空间是2种武器中较小的一个
枚举从 0-自己容纳上述最多数量
为啥要是 2种最小的呢个 反正是从0开始对吧 这个主要影响的助手
如果助手先从大的容量武器选的呢么 可能就会出现 明明可以选择更多的 小的容量的武器
具体看AC代码
错误代码,核心区域示例:(也就是替换AC代码,这个是先偷的大件的武器)

		k=min(neww,ff/w);
		temp+=k,ff-=k*w;
		k=min(ff/s,news);
		temp+=k;

AC代码:

#include
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
const ll inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=2e5+10;
int a[1026],flag[1026],book[1026];
int main(){
     
       // #define io
#ifdef io
        freopen("in.txt","r",stdin);
#endif
int t;
cin>>t;
while (t--) {
     
	int p,f;
	int as,aw,s,w;
	cin>>p>>f>>as>>aw>>s>>w;
	if(s>w) swap(s,w),swap(as,aw);//将大小区分出来 s为 占空间小的
	int ma=p/s,ans=0;
	ma=min(ma,as);
	for(int i=0;i<=ma;i++){
     //枚举
		int news=as-i;
		int neww=aw;
		int temp=i;
		int pp=p-s*i;
		int ff=f;
		int k=min(neww,pp/w);
		temp+=k,neww-=k;
		k=min(ff/s,news);//必须S在前
		temp+=k,ff-=k*s;
		k=min(neww,ff/w);// W在后
		temp+=k;
		ans=max(ans,temp);
	}
	cout<<ans<<endl;
}
return 0;
}

C. Binary String Reconstruction

问题分析:给定一种加密规则,让你还原

因为只有 都是0的情况下才会出现加密码中出现0所以 通过这一条件就可以还原出
原本的字符信息 。。。然后在进行一遍校验。
具体看AC代码

ss.resize(s.size()); 用来规定ss字符串长度

AC代码:

#include
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
const ll inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=2e5+10;
int a[1026],flag[1026],book[1026];
int main(){
     
       // #define io
#ifdef io
        freopen("in.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--){
     
	int n;
	string s,ss;
	cin>>s>>n;
	ss.resize(s.size());
	int len=s.length();
	for(int i=0;i<len;i++){
     
		ss[i]='1';
	}
	for(int i=0;i<len;i++){
     //根据0判断 源字符串中0的位置
		if(s[i]=='0'){
     
			if(i-n>=0) ss[i-n]='0';
			if(i+n<len) ss[i+n]='0';
		}
	}
	int f=1;
	for(int i=0;i<len;i++){
     //校验 是否正确
		if(s[i]=='1'){
     
			int ff=1;
			if(i-n>=0&&ss[i-n]=='1') ff=0;
			if(i+n<len&&ss[i+n]=='1') ff=0;
			if(ff){
     
				f=0;
				break;
			}
		}
	}
	if(!f)cout<<"-1"<<endl;
	else{
     
		cout<<ss<<endl;
	}
}
return 0;
}

你可能感兴趣的:(CodeForces)