问题 C: 幸运数字II
题目描述
数字4和7是幸运数字,而其他的都不是幸运数字。一个整数是幸运数字,当且仅当它的十进制表示只包含幸运数字。
现在让你给出第K大的幸运数字。
输入
第一行一个整数K(1<=K<=1,000,000,000)
输出
第K大的幸运数字。
样例输入 Copy
1
样例输出 Copy
4
思路:
4 100
7 111
用0来代表4,用1来代表7
用一个n来代表位数,我们可以发现,这其实就像一个二叉树,n = 1时有两个,n = 2时有四个,即
2^1 = 2
2^2 = 4…
所以我们可以把k+1转化成二进制,可以算出n的大小
只需要去掉头位然后按顺序输出即可
ll k;
int a[35],c[35];
void fun(ll x){
int i = 0;
while(x)
{
c[++i] = x%2;
x /= 2;
}
for(itn j=1;j<=i;j++)
a[j] = c[j];
}
int main(){
cin >> k;
memset(a,0,sizeof(a));
fun(k+1);
int s = 32;
while(a[s] == 0 && s > 1) s--;//去前导零
for(int i=s-1;i>=1;i--){
if(a[i] == 0) printf("4");
if(a[i] == 1) printf("7");
}
}
问题 D: 分糖果分数
题目描述
幼儿园的N个小朋友得到了M颗糖果。
每个小朋友都有一个想要得到的糖果数目,如果没有达到他们的预期,就会不高兴。不高兴的程度可以用一个数值表示,就是他们无法满足的糖果数目的平方。例如,一个小朋友想要得到32颗糖果,而他只得到29颗糖果,那么有3颗糖果无法满足,因此不高兴值为9.
不幸的是,现有的糖果无法满足所有的小朋友,因此,需要你给出一个分配方案,使得不高兴值的总和最小。
输入
第一行两个整数M和N(1<=M<=2 * 10^9)(1<=N<=100,000)
接下来N行,每行一个整数,表示每个孩子想要的糖果数。每个小于2 * 10^9且总和肯定超过M
输出
最少生气值总和。输出数据保证结果在int64范围之内。
样例输入 Copy
5 3
1
3
2
样例输出 Copy
1
ll m,n,t,tail,sum,ans;
ll a[maxn];
int main()
{
scanf("%lld%lld",&m,&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum += a[i];//计算小朋友希望得到的糖果总和
}
if(sum <= m)//如果可以满足,那么没有小朋友会不满意
{
printf("0\n");
return 0;
}
sort(a+1,a+1+n);
t = m,tail = 0;
for(int i=n;i>0;i--)
{
if(t >= (a[i]-a[i-1])*(n-i+1))
t -= (a[i]-a[i-1])*(n-i+1);
else
{
ll p = a[i]-t/(n-i+1);
ll q = t%(n-i+1);
ans += p*p*(n-i+1-q)+(p-1)*(p-1)*q;
tail = i;
break;
}
}
for(int i=0;i<tail;i++)
ans += a[i]*a[i];
printf("%lld\n",ans);
return 0;
}