CF the little match girl (贪心!!!)

点击打开链接

解放1

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int M=1e5+20; 
char a[M];
int n;
int num[10]={6,2,5,5,4,5,6,3,7,6};//组成数字i需要多少根木棒 
bool check(long long cnt,int i)
{
	return cnt>=(n-1-i)*2&&(n-1-i)*7>=cnt;//必选保证剩下的cnt 能放完  

}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
	
		cin>>n;
		long long cnt=0;
		scanf("%s",a);
		for(int i=0;i<n;i++)
		{
			cnt+=num[a[i]-'0'];//统计总共有多少根木棒 
		}
		for(int i=0;i<n;i++)
		{
			for(int k=9;k>=0;k--)//数字尽量大 高位尽量大 
			{
				if(check(cnt-num[k],i))//能否放该数字 
				{
					cnt-=num[k];
					a[i]=k+'0'; 
					break;		
				}
			}
		} 
		printf("%s\n",a);
	}
	return 0;
} 
解放2

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int M=110000;
char a[M];

int n;
struct dat{
	int stick;
	int many;
}s[10]={{0,4},{1,0},{2,3},{3,3},{4,2},{5,3},{6,4},{7,1},{8,5},{9,4}}; 
bool cmp(dat a,dat b)
{
	if(a.many==b.many)
	return a.stick>b.stick; 
	
	return a.many>b.many; 
	
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		cin>>n;
		int num[10]={4,0,3,3,2,3,4,1,5,4};//组成数字i需要多少根木棒 
		long long cnt=0;
		scanf("%s",a);
		for(int i=0;i<n;i++)
		{
			cnt+=num[a[i]-'0'];//统计总共有多少根木棒 
			a[i]='1';
		}
		int k=9;
		for(int i=0;i<n;i++)//尽量大  
		{
			while(cnt<num[k])
			{
				k--;
			}
			cnt-=num[k];
			a[i]=k+'0';
		}
		if(cnt)
		{
			k=0;
			sort(s,s+10,cmp);
			for(int i=n-1;i>=0;i--)//数字已经最大化 任何改变都会使数值变低
									//所以从低位开始尽快把stick用完 
			{
				cnt+=num[a[i]-'0'];
				while(cnt<s[k].many&&k<10)
				{
					k++;
				}
				cnt-=s[k].many;
				a[i]=s[k].stick+'0';
				if(cnt==0)// 用完就退出 
				break;
			
			}
			
		}
	//	cout<<"@"<<cnt<<endl; 
		printf("%s\n",a);
	}
	return 0;
} 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值