求助关于CSP-J T3 思路证明
  • 板块灌水区
  • 楼主yinbe2
  • 当前回复2
  • 已保存回复3
  • 发布时间2024/11/2 11:09
  • 上次更新2024/11/2 14:49:10
查看原帖
求助关于CSP-J T3 思路证明
1285691
yinbe2楼主2024/11/2 11:09

考场上想的贪心:先尽量取 88 ,然后看剩下的木棍数,余 11 就删掉一个 88,然后前面插入 1010 (没有木棍数为 11 的数字),余2到7就取木棍数为余数的的最小的数字,余 22 就在前面插入 11 (木棍数为 22 的只有 11 ),余 33 就在前面插入 77 (木棍数为 33 的只有 77 ),余 44 在前面插入 44 (木棍数为 44 的只有 44),余 55 就在前面插入 22 (木棍数为 55 的有2352、3、5 ,其中 22 最小),余 66 就在前面插入 66 (木棍数为 66 的有 0690、6、9,但 00 不能放前面,所以是 66 ),然后从前往后扫,每次将第 ii 位和第 i+1i+122 个数字换成木棍数相同但是数字更小的数, i=1i=1 时特判0不能在前面。最后输出,洛谷、小图灵、核桃编程的自测都能过。

代码:

#include<iostream>
#include<map>
using namespace std;
int T,n;
string s;
const int c[]={6,2,5,5,4,5,6,3,7,6};
map<int,pair<int,int>>mp1;
map<int,pair<int,int>>mp2;
bool cmp(int a1,int a2,int b1,int b2)
{
	if(a1!=b1)return a1<b1;
	return a2<b2;
}
void chushi()
{
	for(int i=1;i<=14;i++)
	{
		for(int j=0;j<=9;j++)
		{
			for(int k=j;k<=9;k++)
			{
				if(j==0&&k==0)continue;
				if(c[j]+c[k]==i)
				{
					if(mp1.find(i)==mp1.end())
					{
						if(j==0)mp1[i]={k,j};
						else mp1[i]={j,k};
					}
					else
					{
						bool flag=false;
						if(j==0)
						{
							swap(j,k);
							flag=true;
						}
						int f1=mp1[i].first;
						int f2=mp1[i].second;
						if(cmp(j,k,f1,f2))
						{
							mp1[i]={j,k};
						}
						if(flag)swap(j,k);
					}
				}
			}
		}
	}
	for(int i=1;i<=14;i++)
	{
		for(int j=0;j<=9;j++)
		{
			for(int k=j;k<=9;k++)
			{
				if(c[j]+c[k]==i)
				{
					if(mp2.find(i)==mp2.end())
					{
						mp2[i]={j,k};
					}
					else
					{
						int f1=mp2[i].first;
						int f2=mp2[i].second;
						if(cmp(j,k,f1,f2))
						{
							mp2[i]={j,k};
						}
					}
				}
			}
		}
	}
}
int main()
{
//	freopen("sticks.in","r",stdin);
//	freopen("sticks.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0); 
	chushi();
	cin>>T;
	while(T--)
	{
		cin>>n;
		if(n<7)
		{
			switch(n)
			{
				case 1:
				{
					cout<<"-1\n";
					break;
				}
				case 2:
				{
					cout<<"1\n";
					break;
				}
				case 3:
				{
					cout<<"7\n";
					break;
				}
				case 4:
				{
					cout<<"4\n";
					break;
				}
				case 5:
				{
					cout<<"2\n";
					break;
				}
				case 6:
				{
					cout<<"6\n";
					break;
				}
			}
			continue;
		}
		s="";
		for(int i=1;i<=n/7;i++)
			s+='8';
		switch(n%7)
		{
			case 0:break;
			case 1:
			{
				s.pop_back();
				s='0'+s;
				s='1'+s;
				break;
			}
			case 2:
			{
				s='1'+s;
				break;
			}
			case 3:
			{
				s='7'+s;
				break;
			}
			case 4:
			{
				s='4'+s;
				break;
			}
			case 5:
			{
				s='2'+s;
				break;
			}
			case 6:
			{
				s='6'+s;
				break;
			}
		}
		for(int i=0;i<(int)(s.size())-1;i++)
		{
			char c1=s[i],c2=s[i+1];
			int quan=c[c1-'0']+c[c2-'0'];
			if(i==0)
			{
				s[i]=mp1[quan].first+'0';
				s[i+1]=mp1[quan].second+'0';				
			}
			else
			{
				s[i]=mp2[quan].first+'0';
				s[i+1]=mp2[quan].second+'0';
			}
		}
		cout<<s<<"\n";
	}
	return 0;
}
/*
不要挂分!不要挂分!不要挂分!
rp++
rp++
rp++
rp++
rp++
*/
2024/11/2 11:09
加载中...