P2192 HXY玩卡片 題解

zhuluoan發表於2024-05-01

題目簡述

給定一些 $5$ 和 $0$ 的數字,讓你在其中選擇一些數進行排列成為一個非負整數,使得這個數字能被 $90$ 整除,且是所有滿足條件的數中最大的一個,無解輸出 $-1$。

題目分析

如果一個數能被 $90$ 整除,那麼它一定能被 $9$ 和 $10$ 整除。

  • 能被 $10$ 整除,那就說面答案的個位數一定是 $0$,如果沒有 $0$ 的話就是無解。
  • 能被 $9$ 整除,那就說明答案的各個位加起來的和能被 $9$ 整除,由於答案僅有 $0$ 和 $5$ 組成,所以只需要判斷所有 $5$ 加起來能否被 $9$ 整除即可。也就是說,如果有 $x$ 個 $5$,那麼需要保證 $5 \cdot x$ 是 $9$ 的倍數,所以有 $x \mid 9$。

有了上面的推導,我們便有了解法:

設一共有 $x$ 個 $5$,因為要滿足 $x \mid 9$,所以我們最多隻能選 $\lfloor \frac{x}{9} \rfloor \times 9$ 個 $5$。因為要求最大,所以把這些 $5$ 先輸出,最後輸出有的所有 $0$。但是有可能沒有足夠的 $5$,這樣就只能輸出 $0$ 了,當然是在有 $0$ 的情況下。

程式碼

#include<iostream>
using namespace std;
int n,cnt1,cnt2;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
	    if(ch=='-')
		{
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
	    x=(x<<1)+(x<<3)+ch-48;
	    ch=getchar();
	}
	return x*f;
}
inline void write(int x)
{
    if(x<0)
	{
    	putchar('-');
		x=-x;
	}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
int main()
{
	n=read();
	for(int i=0,a=0;i<n;i++)
	{
		a=read();
		a==5?cnt1++:cnt2++;
	} 
	if(cnt1>=9&&cnt2>0)
	{
		for(int i=1;i<=cnt1/9*9;i++)
		{
			printf("5");
		}
		for(int i=1;i<=cnt2;i++)
		{
			printf("0");
		}
	}
	else if(cnt2>0)
	{
		printf("0");
	}
	else printf("-1");
	return 0;
}

相關文章