1. 程式人生 > 其它 >資訊學奧賽一本通 1100:金幣 | OpenJudge NOI 1.5 45

資訊學奧賽一本通 1100:金幣 | OpenJudge NOI 1.5 45

技術標籤: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; }