Codeforces Round 960 (Div. 2) (个人题解)(未完成)

前言:

  参加的第二场cf比赛,这场比赛又只过了两道,第三道就差那么一点点就能过了,可惜时间到了,其实主要还是我codeing的速度太慢了吧,还需练习啊。

正文:

比赛链接:Dashboard - Codeforces Round 960 (Div. 2) - Codeforces

A. Submission Bait:

#include <bits/stdc++.h>
using namespace std;
int a[100];
int main(){
	int t;
	cin>>t;
	while(t--){
		memset(a,0,sizeof(a));
		int n,x,res=0,flag=0;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>x;
			a[x]++;
		}
		for(int i=n;i>=1;i--){
			if(a[i]==0)continue;
			if(a[i]%2==1){
				flag=1;
				break;
			}
		}
		if(flag)cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

博弈相关的问题,题目大意是依次在数组里选数,后面的人选的数必须要比前面的大于或等于,问先手怎样必赢,我们很容易想到先手要输只能是这个数组里所有数出现的次数都为偶数,直接遍历判断即可。

B. Array Craft:

#include <bits/stdc++.h>
using namespace std;
int a[200005];
int main(){
	int t;
	cin>>t;
	while(t--){
		int n,x,y;
		cin>>n>>x>>y;
		for(int i=y;i<=x;i++){
			a[i]=1;
		}
		for(int i=x+1;i<=n;i++){
			if(a[i-1]>=0)a[i]=-1;
			else a[i]=1;
		}
		for(int i=y-1;i>=1;i--){
			if(a[i+1]>=0)a[i]=-1;
			else a[i]=1;
		}
		for(int i=1;i<=n;i++)cout<<a[i]<<" ";
		cout<<endl;
	}
	return 0;
}

思维题,题目大意是告诉你一个只含1和-1的数组的最大前缀的第一次出现点x和最大后缀的第一次出现点y(x>y),让你输出原数组(答案不唯一但一定存在),我的做法就是让x和y之间的数都为一,1到y-1的数为-1,1,-1,1……,n到x+1的数为-1,1,-1,1……,这样得出的答案一定为正确答案。

C. Mad MAD Sum:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200005],b[200005],c[200005],pre[200005];
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		ll ans=0;ll res=0;
		map<int,int> b;map<int,int> p; 
		for(int i=1;i<=n;i++){
			cin>>a[i];ans+=a[i];
			b[a[i]]++;
			if(b[a[i]]>=2){
				res=max(a[i],res);
			}
			c[i]=res;
		//	cout<<c[i]<<" ";
		}
		res=0;
		for(int i=1;i<=n;i++){
			ans+=c[i];
			p[c[i]]++;
			if(p[c[i]]>=2){
				res=max(c[i],res);
			}
			a[i]=res;
			//cout<<a[i]<<" ";
		}
		for(int i=1;i<=n;i++){
			pre[i]=pre[i-1]+a[i];
			ans+=pre[i];
		}
		cout<<ans<<endl;
	}
	return 0;
}

这题真是让我很意难平了,真的是就差一步了,b,p原先用的数组来当桶,不过因为清零超时了,当时就剩个10来秒要是改map改的快的话说不定就过了(悲)。题目大意是让我们对一个数组进行求和,不过每次求和过后原数组都会按一定规则发生改变,改变的规则如题所示,问我们最后的答案。这题看似很复杂,其实也不简单,但只要你细心就一定会发现数组第一次改变后会变得有序,第二次改变就只会剩下出现两次的数字,而从三次开始后数组的变化就相当于是将变化前数组向后移动一位(第一位补0),去掉后面移动出数组范围的数字,直至数组元素全为0结束(不信可以自己写一个数组推推试试),从第三次开始到最后加和的总值我们很容易看出来其实就是对第二次变化后的数组的前缀和数组求和的值,我们可以先通过两次循环来求解二次变化后的数组,顺便将前两次的和也一起加上,这样就可以得出答案。

待补(咕咕咕):

D. Grid Puzzle

E1. Catch the Mole(Easy Version)

E2. Catch the Mole(Hard Version)

F. Polygonal Segments

后记:

  codeforce上比赛题目的质量确实不错,而且更考验思维,不会说很生硬的考察算法。

  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值