Advertisement

湖南科技大学2014 ACM 校赛

阅读量:

签到积分

在一段时间内进行观察后发现ACM实验室的工作效率较低,并因此采取了一种传统的签到积分制度。然而,在意识到ACMer的成长需要长期坚持的基础上,并开发了一种鼓励连续签到的规定。

签到积分规则如下:

每天一来ACM实验室学习并录入指纹就算完成打卡任务积攒相应学分;假如某一天没有打卡当天学分计为零分。
连续打卡的情况下第一天积攒一分第二天积攒二分依此类推直到第n天能够积攒n分。
假如在连续打卡过程中出现缺勤现象那么下次再次打卡时缺勤的天数就会重新开始计算。

自从有了积分制度后,ACM实验室的利用率大大的提高。

某一天集训队队长在完成日常打卡后宣布了一个挑战性问题给队员们思考。随后她公布了自己的累计打卡积分值,并要求队员们计算她最少需要连续打卡多少天才能达到这一成绩;接着还要求计算从开始打卡到最后打卡期间最多可能存在的未打卡日数。

输入

有多组测试数据

每行输入1个一个正整数n(1<=n<=500500)

输出

基于输入测试数据,在每行中输出两个数值:第一个数值代表连续签到所需的最短天数;第二个数值代表中途中断时仍能完成全部签到所需的最短天数(以空格分隔)。

样例输入

5
8
22
25
27
28

样例输出

4 2
5 2
7 1
9 2
9 1
7 0

复制代码
 #include <iostream>

    
 #include <cstdio>
    
 #include <cstring>
    
 #include <vector>
    
 #include <cmath>
    
 using  namespace std;
    
  
    
  
    
 int main()
    
 {
    
     int n;
    
     int x,ans,k;
    
     int temp=0;
    
     while(~scanf("%d",&n))
    
     {
    
    x=ans=k=0;
    
    do{
    
     // 每次找一个最大的数
    
      x=(int)sqrt(2.0*n)+1;
    
      while(x*(x+1)>2*n)x--;
    
      ans+=x;
    
      n-=x*(x+1)/2;
    
      if(n>0)k++;
    
      //printf("%d %d\n",x,n);
    
    }while(n>1);
    
    if(n==1) ans++;
    
    printf("%d %d\n",ans,k);
    
     }
    
  
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~