关闭

UVa 12955 Factorial

标签: uvaACM
293人阅读 评论(0) 收藏 举报
分类:

Problemuva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4834

开始想多了,想着不能简单贪心,要用dp,于是写了下面的代码:

题目 n 最大1e5,而 15! > 1e5,所以 fac[] 开16就够

dp[0]表示钞票总额,dp[1]表示钞票数

#include <stdio.h>
#include <string.h>
int fac[16],dp[2][100001];
int min(int a,int b)
{
    return a<b?a:b;
}
int main()
{
    int i,n;
    for(i=n=fac[0]=1;i<16;i++)
        fac[i]=n*=i;
    while(~scanf("%d",&n))
    {
        int j;
        memset(dp,0,sizeof(dp));
        for(i=0;i<=n;i++)
          for(j=fac[i];j<=n;j++)
          {
              if(dp[0][j-fac[i]]+fac[i]>dp[0][j])
              {
                  dp[0][j]=dp[0][j-fac[i]]+fac[i];
                  dp[1][j]=dp[1][j-fac[i]]+1;
              }
              if(dp[0][j-fac[i]]+fac[i]==dp[0][j])
                dp[1][j]=min(dp[1][j],dp[1][j-fac[i]]+1);
          }
        printf("%d\n",dp[1][n]);
    }
    return 0;
}

过了样例,交上去超时

后来想:1! =1 啊,所以肯定能用 1! 补充 n 减去其它阶乘剩下的数

题目相当于:某种货币有面值分别为 1! 、 2! 、…、15! 的钞票,要买价格为 n 的物品,最少要多少张钞票…

#include <stdio.h>
int fac[16];
int main()
{
    int i,n;
    for(i=n=fac[0]=1;i<16;i++)
        fac[i]=n*=i;
    while(~scanf("%d",&n))
    {
        int num=0;
        for(i=15;n>0&&i>0;n%=fac[i--])
            num+=n/fac[i];
        printf("%d\n",num);
    }
    return 0;
}

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

习题4-8 特别困的学生 UVa12108

#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #define N 1000000 int n...
  • u014800748
  • u014800748
  • 2014-08-06 21:35
  • 1869

UVA-815 flooded!(白书说能锻炼思维的题)

题意挺长的,而且是英文的,我这里就简述一下吧,就是有m*n个格子,每个格子都是10*10的规格(高度是无限的),给出每个格子的海拔,然后给出一个洪水的量,输出最后水深度和完全被水覆盖的面积百分比。这个...
  • FishSeeker
  • FishSeeker
  • 2016-04-08 09:36
  • 953

UVA 1658 - Admiral (拆点+最小费用流)

该题中的拆点法是解决几点容量的通用方法 。  因为只有容量限制的话仍然不能满足每个结点只访问一次这个限制 ,原因很简单,大家画个图就知道了,假设从起点有两条路到同一个结点2,然后又都到末点n,虽然它们...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2015-08-21 20:53
  • 1093

uva 12174 - Shuffle(预处理+暴力)

题目链接:uva 12174 - Shuffle 题目大意:有一个播放器用于播放音乐,现在给出s(已有曲目的数量),n给出记录的长度。播放器有随机播放的功能,每次生成一个1~s的随机系列进行...
  • u011328934
  • u011328934
  • 2014-02-16 19:05
  • 1495

Rails(UVa514)(栈)

Rails  There is a famous railway station in PopPush City. Country there is incredibly hilly. Th...
  • hdd871532887
  • hdd871532887
  • 2015-12-21 07:13
  • 648

例题10-2 不爽的裁判 UVa12169

1.题目描述:点击打开链接 2.解题思路:本题要求找到合适的一组a,b,使得按照递推公式能输出正确的x2,x4...可以枚举a值,通过列写方程得到b的值,但这里有一个问题,这里是一个同余方程,等号的...
  • u014800748
  • u014800748
  • 2015-02-20 12:31
  • 889

区间DP(修缮长城,uva 1336)

十几发一直RTE和TLE。 万万没想到是输入输出的问题。。。 while(scanf("%d %d %d",&n,&v,&x)&&n+v+x) 这样也不行while(scanf("%d %d %d"...
  • xl2015190026
  • xl2015190026
  • 2016-09-26 14:27
  • 344

UVa822 - Queue and A(看着也写不利索的结构体)

#include #include #include using namespace std; struct topic{ int tid, num, t0, t, dt, q_num, fi...
  • a197p
  • a197p
  • 2015-03-11 15:41
  • 557

【字典序最小最大权独立集】uva12288

题意:在n*m的网格上填马,其攻击范围是±3,±1这种类型,每个格子有个权值,有些格子可以选,有些不能选,求一种字典序最小的,马互不攻击的,权值之和最大的一种方案 明显按行奇偶染色,就变成了二分图上的...
  • huyuncong
  • huyuncong
  • 2013-11-24 21:46
  • 728

uva10935(栈)

Problem B: Throwing cards away I 对于此题,我只能说很无奈,就是因为输入1的时候没有控制好,所以答案一直是错误的! Given is an ordered dec...
  • u010286750
  • u010286750
  • 2013-06-20 13:39
  • 1113
    个人资料
    • 访问:29955次
    • 积分:1640
    • 等级:
    • 排名:千里之外
    • 原创:140篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    男默女泪…
    最新评论