[jzoj]火柴:解題報告
阿新 • • 發佈:2018-11-10
本來想向以前一樣把D組4道提的解題報告都寫成部落格的,但是今天實在是太累了,再是有些一我還沒AC(這是重點),所以今天的D組解題報告就沒了,望原諒。還有,我每天寫部落格要花掉將近一個小時的時間,但是即使我這麼用心寫,卻也換不來你們的一個轉發、一個贊、一條評論……
今天的文言文也沒了。
開始吧!
火柴
題目描述:
注意不能多出或者少一位, 火柴棍要全部用上.
輸入:
第一行整數T,表示資料組數接下來T行,每行一個整數N, 然後是N位數,表示原來的數,可能會有前導0,中間用空格隔開。
輸出:
對於每組資料,輸出一行,最大的能得到的數是多少。
資料範圍限制:
對於20%的資料:1 ≤ n ≤ 10對於60%的資料:1 ≤ n ≤ 1000
對於100%的資料: 1 ≤ n ≤ 100000,1 ≤T≤ 10
思路:
統計每種數字需要多少火柴棒,貪心從高到低位,從大到小放數字,注意因為火柴棒要
恰好用完,且位數一樣,所以要時刻檢查當前火柴棒是否存在符合要求的放置方法,即檢查全
部放1或者全部放8行不行。
Code:
如果你是好心人,就給我一個轉發,一個贊,一個評論……謝謝!#include <cstdio> #include <cstring> using namespace std; const int cnt[10] = {6,2,5,5,4,5,6,3,7,6}; int t,n,sum,cur; char ch; inline bool judge(int i,int j) {return i * 2 <= j && j <= i * 7;} int main() { freopen("match.in","r",stdin); freopen("match.out","w",stdout); scanf("%d",&t); while(t--) { sum = 0; scanf("%d",&n); for(register int i = 1;i <= n;++i) { scanf(" %c",&ch); sum += cnt[ch - '0']; } for(register int i = n;i >= 1;--i) { cur = 9; if(i == 1) { while(sum != cnt[cur]) --cur; putchar(cur + '0'); break; } while(!judge(i - 1,sum - cnt[cur])) --cur; sum -= cnt[cur]; putchar(cur + '0'); } puts(""); } return 0; }