简单地说,三个题都是签到题。
A. Dislike of Threes
A链接
题意:
就是规定一系列的数,既不能被3整除,又不能以3结尾,给一个k,问这一系列书中第k个数的值。
解题思路:
数据范围小,判断出1到1000中的符合条件的数,
用数组存下来,就可以直接按数组下标访问,并得到答案啦
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;
}