資訊學奧賽一本通 1100:金幣 | OpenJudge NOI 1.5 45
阿新 • • 發佈:2021-01-13
技術標籤:C++基礎資訊學奧賽一本通題解OpenJudge NOI題解c++
【題目連結】
ybt 1100:金幣
OpenJudge NOI 1.5 45:金幣
【題目考點】
1. 迴圈
【解題思路】
國王發金幣
在第1階段,持續1天,每天給1個金幣
在第2階段,持續2天,每天給2個金幣
…
在第d階段,持續d天,每天給d個金幣
- 設變數d表示國王發金幣的階段,設j表示現在是在當前階段中的第幾天
- i從1迴圈到n,表示天數,每天獲得d個金幣,j增加,並嘗試更新階段數d。
- 或每次迴圈,發放一個階段的金幣。
【題解程式碼】
解法1:每過一天,嘗試更新當前階段
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int sum = 0, d = 1, j = 1;//d:當前在第幾階段, j:在這一階段第幾天 sum:活得的總金幣數
for(int i = 1; i <= n; ++i)//i:從開始算起到了第幾天
{
sum += d;//當前處於階段d,第i天獲得d個金幣
if(j >= d)//若在當前階段已經過了d天
{
d++;//階段數增加1
j = 1;//下一天是新的階段的第一天
}
else
j++;//處於本階段的天數增加
}
cout<<sum;
return 0;
}
解法2:每次發放一個階段的金幣
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, sum = 0, d = 0, i = 1;//sum:獲得的總金幣 d:階段數 i:天數
cin>>n;
while(i <= n)//每次while迴圈,發放一個階段的金幣
{
d++;
for(int j = 1; j <= d; j++)
{
sum += d;
i++;
if (i > n)
break;
}
}
cout<<sum;
return 0;
}