Codeforces Round 981 (Div. 3) (A~F)

文章目录

  • [A. Sakurako and Kosuke](#A. Sakurako and Kosuke)
  • [B. Sakurako and Water](#B. Sakurako and Water)
  • [C. Sakurako's Field Trip](#C. Sakurako's Field Trip)
  • [D. Kousuke's Assignment](#D. Kousuke's Assignment)
  • [E. Sakurako, Kosuke, and the Permutation](#E. Sakurako, Kosuke, and the Permutation)
  • [F. Kosuke's Sloth](#F. Kosuke's Sloth)

Codeforces Round 981 (Div. 3)

A. Sakurako and Kosuke

思路

签到题,直接判断奇偶即可

code

cpp 复制代码
void solve(){
	int n;cin >> n;
	if(n & 1) cout << "Kosuke" << endl;
	else cout << "Sakurako" << endl;
	return ;
}

B. Sakurako and Water

思路

考点:模拟

从头开始遍历,如果当前数 < 0,则说明这个数需要进行增加操作,那就遍历这个数的对角线,找出最大值,将这个对角线都加上最大值即可

将这些最大值全部累加,最后输出即可

code

cpp 复制代码
const int N=1000;
int a[N][N];
void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;++i)
	   for(int j=1;j<=n;++j){
	   	cin >> a[i][j];
	   }
	int ans=0;
	for(int i=1;i<=n;++i)
	   for(int j=1;j<=n;++j){
	   	if(a[i][j]<0){
	   		int k=min(n-i+1,n-j+1);
	   		int s=0; 
	   		for(int z=0;z<k;++z){
	   			if(a[i+z][j+z]<0) s=max(s,abs(a[i+z][j+z]));
			   }
			for(int z=0;z<k;++z){
	   			a[i+z][j+z]+=s;
			   }
			ans+=s;
		   }
	   }
	cout << ans << endl;
	return ;
}

C. Sakurako's Field Trip

思路

考点:模拟

暴力解法,我们只需要考虑每一项 i i i 和它的镜像 n − i + 1 n-i+1 n−i+1 前后四项的值
如果这四个数有3个数的值相同,ans++,如果这四个数都相同,ans+=2

这时还需要考虑边界的问题,如果这个数为奇数并且遍历到中间这个数

那么我们就只需要考虑3个数,中间这个数和它前后这两个数

  • 如果这三个数都相同,ans+=2
  • 中间的数和前面的数相同或者中间的数和后面的数相同,ans++

如果这个数为偶数并且遍历到中间这两个数
那么我们只需要判断这两个数是否相同即可,相同ans++

讲起来有点复杂,实际上代码挺简单的

code

cpp 复制代码
int a[N];
void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;++i) cin >> a[i];
	int ans=0;
	for(int i=1,j=n;i<j;++i,--j){
		map<int,int> m;
		m.clear();
		if(i+1<j-1){
			m[a[i]]++,m[a[i+1]]++,m[a[j]]++,m[a[j-1]]++;
			for(auto x : m){
				if(x.se==3) ans++;
				if(x.se==4) ans+=2;
			}
		}
		else if(i+1==j-1){
			int x=a[i],y=a[i+1],z=a[j];
			if(x==y){
				if(x==z) ans+=2;
				else ans+=1;
			}
			else{
				if(y==z) ans+=1;
			}
		}
		else{
			if(a[i]==a[j]) ans+=1;
		}
	}
	cout << ans << endl;
	return ;
}

D. Kousuke's Assignment

思路

考点:前缀和

对于数组 a a a ,先计算出它的前缀和,对于这个前缀和,我们维护当前 i i i 的上一个下标

如果遇见相同的前缀和,查询该前缀和的上一个下标是否小于上一段线段的结束位置

如果小于则选择,更新该前缀和的上一个下标为 i − 1 i-1 i−1

code

cpp 复制代码
int a[N],sum[N];
void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;++i){
		cin >> a[i]; 
		sum[i]=sum[i-1]+a[i];
	} 
	int ans=0,mx=-1;
	map<int,int> m;
	m[0]=0;
	for(int i=1;i<=n;++i){
		if(m.count(sum[i])){
			if(m[sum[i]]>mx){
				ans++;
				mx=i-1;
			}
		}
		m[sum[i]]=i;
	}
	cout << ans << endl;
	return ;
}

E. Sakurako, Kosuke, and the Permutation

思路

我们可以将这题看成一个环, i − > p i − > p p i − > ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ − > i i ->p_i->p_{pi}->······->i i−>pi−>ppi−>⋅⋅⋅⋅⋅⋅−>i 为一个循环节

我们需要将这个环拆分成若干个自环和环节数为2的环

如果这个环为自环,代表自己指向自己 ,如果这个环的环节为2,代表这个环里的两个数相互指向对面

把玩一下不难发现,替换 p p i = i p_{pi}=i ppi=i 优于 p i = i p_i=i pi=i 的操作
因为进行 p i = i p_i=i pi=i 的替换只能保证一个数是准确的,让这个数形成自环
而进行 p p i = i p_{pi}=i ppi=i 不仅可以保证一个数是准确的,还有可能会形成环节为2的环

因此我们只需要考虑 p p i = i p_{pi}=i ppi=i 的操作即可,用map存储环,每次进行替换操作维护map即可

code

cpp 复制代码
int a[N];
void solve(){
	int n;cin >> n;
	map<int,int> m;
	for(int i=1;i<=n;++i){
		cin >> a[i];
		m[a[i]]=i;
	} 
	int ans=0;
	for(int i=1;i<=n;++i){
		if(a[i]!=i && a[a[i]]!=i){
			int s=m[i];
			int t=a[i]; 
			swap(a[s],a[t]);
			m[a[s]]=s;
			m[a[t]]=t;
			ans++;
		}
	}
	cout << ans << endl;
	return ;
}

F. Kosuke's Sloth

思路

斐波那契数列在模 k k k 意义下有周期性(皮萨诺周期),且这个周期 < = 6 k <=6k <=6k
暴力枚举求出周期 r r r,则第 n n n 个数的下标为 r n rn rn

code

cpp 复制代码
int f[N];
void solve(){
	int n,k;
	cin >> n >> k;
	f[1]=1,f[2]=1;
	if(k==1){
		cout << n%mod << endl;
		return ;
	}
	int ans=0;
	for(int i=3;i<=6e5+5;++i){
		f[i]=(f[i-1]+f[i-2])%k;
		if(f[i]%k==0){
			ans=i;
			break;
		}
	}
	cout << ((n%mod)*(ans%mod))%mod << endl;
	return ;
}
相关推荐
Coovally AI模型快速验证5 分钟前
当小龙虾算法遇上YOLO:如何提升太阳能电池缺陷检测精度?
人工智能·深度学习·算法·yolo·目标检测·无人机
一路往蓝-Anbo6 分钟前
C语言从句柄到对象 (一) —— 全局变量的噩梦与“多实例”的救赎
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网
松涛和鸣11 分钟前
DAY42 SQLite3 : Dictionary Import and Data Query Implementation with C Language
linux·c语言·数据库·单片机·网络协议·sqlite
低频电磁之道12 分钟前
C++中类的this指针
开发语言·c++
吴声子夜歌21 分钟前
数据结构——通用树(N叉树)
数据结构
surtr138 分钟前
常见排序模板(冒泡排序,希尔排序,堆排序,归并排序,快速排序)
数据结构·算法·贪心算法·排序算法
水饺编程1 小时前
Visual Studio 软件操作:添加附加依赖项
c语言·c++·windows·visual studio
fengfuyao9851 小时前
经典MUSIC算法程序以及测角精度与阵元间距、阵元数、信噪比、快拍数等的关系
算法
十八岁讨厌编程1 小时前
【算法训练营 · 补充】LeetCode Hot100(下)
算法·leetcode·职场和发展
-To be number.wan1 小时前
C++ 进阶技巧:如何让 cout << 自定义对象 正常输出?
开发语言·c++