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符合如下要求
image

求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;
}
posted @ 2021-11-27 17:01  kingwzun  阅读(29)  评论(0编辑  收藏  举报