您的位置:首页 > 其它

PAT 1104 Sum of Number Segments (暴力DFS)

2016-12-09 14:35 260 查看
Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For example, given the sequence {0.1, 0.2, 0.3, 0.4}, we have 10 segments: (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3,
0.4) (0.3) (0.3, 0.4) (0.4).

Now given a sequence, you are supposed to find the sum of all the numbers in all the segments. For the previous example, the sum of all the 10 segments is 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N, the size of the sequence which is no more than 105. The next line contains N positive numbers in the sequence, each no more than 1.0, separated by
a space.

Output Specification:

For each test case, print in one line the sum of all the numbers in all the segments, accurate up to 2 decimal places.

Sample Input:
4
0.1 0.2 0.3 0.4

Sample Output:
5.00


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[22],N,K,P,b[1111],vis[1111],flag;

void dfs(int dis,int sum,int cnt)
{
int i;
if(sum>N || cnt>K) return;
if(sum==N && cnt==K) {
for(i=1;i<=20;i++) b[i]=vis[i];
flag=1;
return;
}
for(i=dis;i<=20;i++) {
if(sum+a[i]>N) break;
vis[i]++;
dfs(i,sum+a[i],cnt+1);
vis[i]--;
}
}

int main()
{
int i,j,f;
scanf("%d%d%d",&N,&K,&P);
for(i=1;i<=20;i++) {
a[i]=i;
for(j=1;j<P;j++)
a[i]*=i;
}
flag=0;
dfs(1,0,0);
if(!flag) printf("Impossible\n");
else {
f=0;
printf("%d =",N);
for(i=20;i;i--) {
while(b[i]--) {
if(f) printf(" +");
f=1;
printf(" %d^%d",i,P);
}
}
printf("\n");
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: