Codeforces Round #739 (Div. 3)A、B、C题题解

这篇博客分享了三道算法题的解题思路,强调了在面对问题时要保持思维简洁,避免过度复杂化。A题是关于排除特定数字的序列查找,通过预处理数组简化了查询;B题是一个数学问题,通过分析得出直接计算对面位置的规律;C题涉及矩阵填充,通过计算圈层和相对位置快速定位。博主提醒,在编程中,用最简单的方法解决问题往往更高效。
摘要由CSDN通过智能技术生成

简单地说,三个题都是签到题。

A. Dislike of Threes

A链接
在这里插入图片描述
题意:

就是规定一系列的数,既不能被3整除,又不能以3结尾,给一个k,问这一系列书中第k个数的值。

解题思路:

数据范围小,判断出11000中的符合条件的数,
用数组存下来,就可以直接按数组下标访问,并得到答案啦

A题 自己写得好复杂,想复杂了。
大佬,四行代码就过了。
我的复杂代码:

#include<bits/stdc++.h>
using namespace std;
int a[2000] = {0,1,2,4,5,7,8,10,11,14};
int main(){
	int k,n;
//	1 2 4 5 7 8 10 11 14 16 17 19 20  
//	1 2 3 4 5 6  7  8  9
	scanf("%d",&n);
	int j = 9;
	for(int i = 16;i<=1666;i++){
			int t = i;
			if(t%10==3) continue;
			int ans = 0;
			while(t){
				ans += t%10;
				t /= 10;
			}
			if(ans%3) a[++j] = i; 
	}
	//for(int i = 0 ;i <=1000;i++) cout<<a[i]<<endl; 
	//交的时候还wa了一发,因为忘记注释这里了  
	while(n--){
		scanf("%d",&k); 
		cout<<a[k]<<endl;
	}
	return 0; 
}

大佬的代码:
!!! 好简洁 真的!

#include<iostream>
//!!!!好简洁  真的! 
using namespace std;
int main(){
    int a[1001],i=1,k=1;  //构建一个a数组
    for(;k<1001;i++)  if(i%3!=0 && i%10!=3)a[k]=i,k++; //k表示位数  所以k小于等于1001 再者
    cin>>k;
    while(k--)cin>>i,cout<<a[i]<<'\n';
}

B. Who’s Opposite?

B题链接
在这里插入图片描述
在这里插入图片描述
内心os:这就是个数学题 !!!不是模拟题 !! 可以模拟了再找规律?

思路:
通过观察:a与b的差值就是圆桌上人数的一半。
然后求一个人对面的人,其实就是加上或者减去总人数的一半。
所以:
steep 1.先求出圆桌上共有多少人。超出了这个范围就是不存在的情况
steep 2.然后如果C是比较大的数,就成半圈,否则,加半圈

总结:其实啥也不用!以后切记!!能用最简单的办法做出来的,就一定不要想复杂了。
AC代码:

#include<iostream>
using namespace std;
int main()
{
	int t,a,b,c,n,x;
	cin>>t;
	while(t--)
	{
	cin>>a>>b>>c;
	x=abs(b-a);
	if(a>2*x ||b>2*x ||c>2*x) cout<<"-1"<<endl;
	else if(c+x<=2*x) cout<<c+x<<endl; //如果超过了就反着转
	else cout<<c-x<<endl;//没超过就正着转
	}
	return 0;
}

C. Infinity Table

C题链接
在这里插入图片描述
在这里插入图片描述
题意
就是按照题目规则填方框,给你一个数k,问你k在方框中的位置(i,j)。

解题思路:
1.首先要找到k在哪个圈层。
又由于是正方形矩阵填数,就可以开根号再上取整快速得到所在的圈层。
2.知到在哪个圈层了,再去判断是在右侧还是在下方,进而计算得出。
AC代码:

#include<bits/stdc++.h>
using namespace std;
int T,k,n;
int main()
{
	for(cin>>T;T;T--)
	{
		cin>>k,n=ceil(sqrt(k)); //找到k在那个外圈
		if(n*n-k<n)//判断在外圈的右侧 还是下方
		cout<<n<<" "<<n*n-k+1<<endl;
		else cout<<n-(n*n-k-n)-1<<" "<<n<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值