有多组数据,暂且以输入负数结束输入:代码如下
#include
using namespace std;
//连续签到越长,分数越高,求最少的签到天数,适合贪心算法,多次连续签到
//每次连续签到中未签到一天,则未签到天数最少
void calculator(int score)
{
int signed_day = 0; //签到天数
int unsigned_day = 0; //未签到天数
int tmp = 0; //模拟签到积分统计
int continued_day = 0; //单次连续签到天数
while (true) //多次连续签到,每次中间停签一天
{
while (tmp < score)
{
continued_day++;
tmp += continued_day;
}//单次连续签到,超过总积分即可后停止,要么刚好,要么多签到一天,下面处理
if (tmp == score)
{
signed_day += continued_day;
break;
}//单次连续签到后,如果签到积分刚好等于总积分,则就是少签到天数
else
{
tmp -= continued_day; //先减去多签到的那一天得到的积分
signed_day += (continued_day - 1); //加上单次连续签到的天数
unsigned_day++; //停止签到一天
continued_day = 0; //置连续签到天数为0
}//单次连续签到后,超出总积分
}
cout << signed_day << " " << unsigned_day << endl;
}
int main()
{
int score = 0;
while (true)
{
cin >> score;
if (score < 0)
break;
calculator(score);
}
return 0;
}