Labels: Compression
Digit sum |
Time limit:2000 ms,Special time limit:5000 ms,Memory limit:65536kb |
Total submit users:69,Accepted users:61 |
Problem 12944:No special judgement |
Problem description |
When Grace was in third grade, her elementary school teacher assigned her the following problem:
What is the smallest possible sum of two numbers that together use the numerals1,2,7,8, And9?
Grace figured out that the answer to this problem is 207 (for example, as 78 + 129), but when the teacher assigned four pages of similar problems as homework, Grace got bored. it turns out that Grace was a rather advanced third grader, so she decided that it wowould be more fun to write a computer program to solve such problems. surely you can do the same!
|
Input |
Input:Each problem is described on a single line. The line begins with an integerN, Such that 2 ≤ N≤ 14 , Designating the number of numerals encoded in the problem. Following that are thoseNNumerals. There will always be at least 2 numerals that are nonzero. The end of the input is designated by a line containing only the value 0.
|
Output |
Output:For each case, output a line with the minimum sumSThat can be achieved. Please keep in mind that by standard convention, the numeral0Cannot appear as the first digit of either summand.
|
Sample Input |
5 1 2 7 8 96 3 4 2 2 2 29 0 1 2 3 4 0 1 2 30 |
Sample output |
20744711257 |
Problem Source |
ACM mid-Central Programming Competition 2013
#include<stdio.h>#include<algorithm>using namespace std;#define mulit(i) (1<<(i))__int64 a[15],sta[mulit(14)];void init(int n){ __int64 sum; int h,i; sort(a,a+n); for(int s=1;s<mulit(n);s++) { h=-1; for( i=0;mulit(i)<=s;i++) if((mulit(i)&s)&&a[i]>0) { h=i; sum=a[i]; break; } if(mulit(i-1)==s) { sta[s]=a[i-1]; continue; } if(mulit(i)>s) { sta[s]=-1; continue; } for( i=0;mulit(i)<=s;i++) if((mulit(i)&s)&&h!=i) sum=sum*10+a[i]; sta[s]=sum; }}int main(){ int n; __int64 minsum; while(scanf("%d",&n)>0&&n) { for(int i=0;i<n;i++) scanf("%I64d",&a[i]); init(n); minsum=-1; for(int s=1;s<mulit(n);s++) if(sta[s]!=-1&&sta[s^(mulit(n)-1)]!=-1) if(minsum==-1) minsum=sta[s]+sta[s^(mulit(n)-1)]; else if(minsum>sta[s]+sta[s^(mulit(n)-1)]) minsum=sta[s]+sta[s^(mulit(n)-1)]; printf("%I64d\n",minsum); }} |
Hnu digit sum (State compression)