贪心+分类讨论完整性:ARC123C

https://www.luogu.com.cn/problem/AT_arc123_c

场上就简单猜了个结论,[1,3]=>1, [4,6]=>2, [7,9]=>3,0=>4,若存在1则此时必须为1个数,否则为4。存在2则必须<=2,否则为4.


但我没对4进行完整讨论。如果4个数则不能凑3(此时可以判断是否进位,只有下一位在[0,3]才能进位),则答案为5

然后还有Corner case。考虑4,然后后面进了一位,也就是这一位要为3,然后答案就只能为5

多对拍

#include
using namespace std;
#define int long long
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;}
#define Z(x) (x)*(x)
#define pb push_back
//mt19937 rand(time(0));
//mt19937_64 rand(time(0));
//srand(time(0));
//#define N
//#define M
//#define mo
int n, m, i, j, k, T, a[20], b[20], ans;

signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
	T=read();
	while(T--) {
		n=read();
		memset(a, 0, sizeof(a)); k=0; a[0]=1111; 
		while(n) a[++k]=n%10, n/=10; ans=0; 
		for(i=k; i>=1; --i) {
			if(a[i]==0) ans=max(ans, 4ll); 
			if(a[i]==1) {
				if(ans>1) ans=max(ans, 4ll); 
				else ans=1; 
			}
			if(a[i]==2) {
				if(ans>2) ans=max(ans, 4ll); 
				else ans=max(ans, 1ll); 
			}
			if(a[i]==3) {
				if(ans==4 && a[i-1]>3) ans=5; 
				else ans=max(ans, 1ll); 
			}
			if(a[i]>=4 && a[i]<=6) ans=max(ans, 2ll); 
			if(a[i]>=7 && a[i]<=9) ans=max(ans, 3ll); 
			b[i]=ans; 
		}
		if(ans==4) {
			for(i=1, j=0; i<=k; ++i) {
				if(b[i]<=3) break; 
				a[i]-=j; if(a[i]==3 && j) ans=5; 
				if(a[i]<=3) j=1; else j=0; 
			}
		}
		cout<<ans<<endl; 
	}

	return 0;
}


你可能感兴趣的:(贪心,分类讨论)