ACM Greater New York 2017 补题
A - Chanukah Challenge
题意:水题不解释了
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
for(int i=0;i<t;i++){
int n;
cin>>n;
int ans;
cin>>ans;
ans=ans+(ans+1)*ans/2;
cout<<n<<" "<<ans<<endl;
}
return 0;
}
B - Sum Squared Digits Function
题意:
给定b,n
n和b符合如下要求
求SSD(b,n)
思路:
- 先由n,b求a
-
- 一看应该就想起来:求2进制,用类似方法退出a就行了
- 由a得出SSD即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int k,b,n;
cin>>k>>b>>n;
long long ans=0;
int a;
while(n){
a=n%b;
ans+=a*a;
n/=b;
}
cout<<k<<" "<<ans<<endl;
}
return 0;
}
J - Toys
题意:
约瑟夫环问题
给定:所有玩具的数目和每次排除第几位
求解:最后留下第几位的玩具
思路:
大神约瑟夫环讲解
代码:
#include <bits/stdc++.h>
using namespace std;
int f(int n, int m){
if(n == 1) return n;
return (f(n - 1, m) + m - 1) % n + 1;
}
int main(){
int n,k;
cin>>n>>k;
cout<<f(n,k)-1<<endl;
return 0;
}
E - Best Rational Approximation
题意:
有P个数据,对于每个数据
输入:编号K,分母最大值M,待求小数x
要求:求一个最接近x的分母不大于M的分数。
思路:
法里数列板子题;
法里数列:
数列的每一项都是相邻两项的中间分数
例如:
0/1 1/1
0/1 1/2 1/1
0/1 1/3 2/3 1/1..
中间产生的分数的分母/分子是前一项与后一项的分母/分子之和。
用二分法找
最后比一下两个分数的小数部分那个更接近题目所给的那个小数
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int k;
long long m;
double p;
cin>>k>>m>>p;
int ans1=0,ans2=1;//初始前一项
int an1=1,an2=1;//初始后一项
while(1){
int x2=ans1+an1;
int y2=ans2+an2;
if(y2>m) break;
if(x2*1.0/y2<=p){//二分
ans1=x2;
ans2=y2;
}
else {
an1=x2;
an2=y2;
}
}
if(abs(ans1*1.0/ans2-p)>abs(an1*1.0/an2-p)){
ans1=an1;
ans2=an2;
}
cout<<k<<" "<<ans1<<"/" <<ans2<<endl;
}
return 0;
}