>description
小明的班上共有 n 元班費,同學們準備使用班費集體購買 3 種物品:
圓規,每個 7 元。
筆,每支 4 元。
筆記本,每本 3 元。
小明負責訂購文具,設圓規,筆,筆記本的訂購數量分別為 a,b,c,他訂購的原則依次如下:
n元錢必須正好用光,即 7a+4b+3c=n。
在滿足以上條件情況下,成套的數量盡可能大,即 a,b,c 中的最小值盡可能大。
在滿足以上條件情況下,物品的總數盡可能大,即 a+b+c 盡可能大。
請你幫助小明求出滿足條件的最優方案。可以證明若存在方案,則最優方案唯一。
>input
輸入僅一行乙個整數,代表班費數量 n。
>output
如果問題無解,請輸出−1。
否則輸出一行三個用空格隔開的整數 a, b, c,分別代表圓規、筆、筆記本的個數。
>sample input
33>sample output
1 2 6
對於測試點 1∼6,保證 n≤14。
對於測試點 7∼12,保證 n 是 14 的倍數。
對於測試點 13∼18,保證 n≤100。
對於全部的測試點,保證 0≤n≤10^5。
>解題思路
美好的一天從刷水開始
題目大意:沒有剩餘的錢 >> 最小值最大 >> 總數最大
由題意得,n元錢可以買到的最大成套數為 n/14(7+4+3),所以可以暴力從 n/14 到 0 開始列舉成套數,只要一符合條件就說明找到答案
因此此時只剩下兩個條件:n剛好花完,盡量讓總數最大
∵ 7=4+3
∴ 當剩下的文具已經不能配套時,讓7元的圓規換成4元的筆和3元的筆記本,增加文具總數
還有一些特殊情況需要處理(具體**):
當n=0時,輸出0 0 0
1+3=4%4=0,2+3+3=8%4=0
>**
#include
#include
#include
using namespace std;
int n, t, a, b, c;
bool s;
int main()
for(int i = n /
14; i >=
0; i--
)//列舉配套數
else
if(t ==
2&& c - i >=2)
//特殊情況,首先考慮沒有剩餘的錢
if(t !=0)
continue
;printf
("%d %d %d"
, a, b, c)
; s =1;
break;}
if(!s)printf
("-1");
//注意這裡也要處理
return0;
}
NOI Online 1 入門組 魔法
全網都是矩陣快速冪,我只會倍增dp 其實這題與 acwing 345.牛站 還是比較像的,那題可以矩陣快速冪 倍增,這題也行。先 floyd 預處理兩點之間不用魔法最短距離 d 複雜度 o n 3 然後預處理兩點之間至多用乙個魔法的最短距離 w 初始為 w d 列舉 i,j 和一條邊 u,v,t w...
NOI Online 1 提高組 序列
luogu p6185 noi online 1 序列 將其轉化為圖論題。定義 u,v 為 a i 所代表的點 u v 為 b i 所代表的點 對於操作 2 將其視為一種權值搬運的操作,從 u 到 v 或者反過來轉移點權。那麼我們對 u,v 和 u v 連一條無向邊,顯然對於乙個連通塊內的所有點都可...
NOI Online 1 提高組 氣泡排序
這個題很繞,記數字i前面有cns i 個數字比他大,逆序對個數就是sigmi cns i 反轉k次就是讓cns i k i 1 i n 而且cns i 不能有負數 利用兩個線段樹維護一下,就是有點繞。include include include include includeusing names...