hdu5417公式法

BCdiv2#52 1001

题意太坑了,我以为每次还要计算machine关闭之后满足w值的各种取余运算,每次还要更新,想起来都觉得头皮发麻,结果久直接弃了BC,打不下去了。

结果刚刚补题的时候发现clarification中有关于1001样例的解析,才知道在关闭的瞬间是允许弹出球,而不是会弹出球。表示理解错误,简直了。

余下的就是对于数学方面的计算的理解了。自己的数学弱爆了。。。。全是坑啊

公式在代码里面,对于我来说真心难想啊。。。。

我觉得一定要注意tt代表的意义,不然绝对是坑

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5
 6 using namespace std;
 7 int x,y,w,n,num,res,tt,ss;
 8
 9 int main()
10 {
11     while(cin>>x>>y>>w>>n){
12         if(x<w){
13             res=(n-1)*(x+y);
14         }
15         else{
16             num=1+x/w;//x时间内可以弹出num个球
17             tt=n%num;//tt=0则表示ss个x的时间足够弹出n个球,但是可能有剩余 ;
18             //tt!=0则表示ss个x的时间之外需要加上tt—1个w的时间
19             ss=n/num;//需要几个x长的时间
20             //cout<<"num"<<num<<"ss"<<ss<<"tt"<<tt<<endl;
21             if(tt!=0)
22                 res=ss*(x+y)+(tt-1+num)%num*w;
23             else
24                 res=(ss-1)*(x+y)+(tt-1+num)%num*w;//
25         }
26         cout<<res<<endl;
27     }
28     return 0;
29 }

某某的代码惊呆了。。。。类似的解题方法,但是完全不同的写法

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5
 6 using namespace std;
 7
 8 int main()
 9 {
10     int x,y,w,n,res=0,tmp,mul,ans=0;
11     while(cin>>x>>y>>w>>n){
12         tmp=x/w+1;//x时间弹出球的个数
13         //cout<<tmp<<" ";
14         mul=(n-1)/tmp;//多少次X时间
15         //cout<<mul<<" ";
16         ans=(x+y)*mul;//ans初始化
17         //cout<<ans<<" ";
18         n-=mul*tmp;//n值更新
19         //cout<<n<<endl;
20         n--;
21         while(n--){
22             ans+=w;
23         }
24         cout<<ans<<endl;
25     }
26     return 0;
27 }

网搜的另一种模拟的写法

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <stack>
 8 #include <set>
 9 #include <map>
10 #include <string>
11 #include <math.h>
12 #include <stdlib.h>
13 #include <time.h>
14 using namespace std;
15 int main()
16 {
17         int x,y,w,n,ans,i,tp;
18     while(~scanf("%d%d%d%d",&x,&y,&w,&n))
19     {
20         i=1;
21         ans=tp=0;
22         while(i<n)
23         {
24             if(ans+w<tp+x)
25             {
26             ans+=w;
27             i++;
28             }
29             else if(ans+w==tp+x)
30             {
31                 i++;
32                 tp+=x;
33                 ans=tp;
34                 if(i==n) break;
35                 i++;
36                 tp+=y;
37                 ans=tp;
38             }
39             else if(ans+w>tp+x)
40             {
41                 i++;
42                 tp=tp+x+y;
43                 ans=tp;
44             }
45         }
46         printf("%d\n",ans);
47     }
48     return 0;
49 }

头一次敲模拟,简直哭死,好在自己AC了

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5
 6 using namespace std;
 7
 8 int main()
 9 {
10     int x,y,w,n,tmp,mul,ans=0;
11     while(cin>>x>>y>>w>>n){
12         int res=0;
13             if(w>x){
14                 res=(n-1)*(x+y);
15             }
16             else if(w==x){
17                 while(n!=0){
18                     n--;
19                     //cout<<"n"<<n<<endl<<res<<endl;
20                     if(n>1)
21                     {
22                         res+=w+y;
23                         n--;
24                     }
25                     else if(n==1)
26                     {
27                         res+=w;
28                         n--;
29                     }//cout<<"res"<<res<<endl;
30                 }
31             }
32             else {
33                 while(n!=0)
34                 {
35                     n--;
36                     int ans=0;
37                     while(ans+w<=x&&n!=0){
38                         ans+=w;
39                         n--;
40                         //cout<<"ans"<<ans<<endl;
41                     }
42                     if(n!=0)
43                     {
44                         res+=x+y;
45                     }
46                     else res+=ans;
47                     //cout<<"res"<<res;
48                 }
49             }
50         cout<<res<<endl;
51     }
52     return 0;
53 }

时间: 2024-10-13 20:58:48

hdu5417公式法的相关文章

「一本通 1.2 练习 3」灯泡(三分/公式法)(三角函数,计算几何)

传送门 这道题要用带一点点三角函数... 不用怕,只要有理性的思维,是可以知道怎么做的 度娘! 说说我对三角函数的理解吧,简单来说,就是如果你知道直角三角形的一个锐角,那你就知道了这个直角三角型的形状了(求出三个角的角度数),那么如果由另一个直角三角型的三个角也跟这个三角形相等,那么他们两个是可以通过比例转化的,他们三条边中任意两条边之比也相等(也就是任意两条边之比如果角的度数固定了,那么这俩条边的比就固定了). 安利: 那么,假设人的影子没有在墙上,那么,人从灯底往右走,走越远影子越长!那么最

挑选指数基金的方法(2):博格公式法

作者:牛大 | 公众号:定投五分钟 大家好,我是牛大.每天五分钟,投资你自己:坚持基金定投,终会财富自由! 上期咱们介绍了一个非常好用的挑选指数基金的方法--盈利收益率法.接下来,牛大再给大家介绍另外一个简单实用的选基方法--博格公式法.大家别被名字吓到了,博格是一位牛人的名字,下面会详细介绍. 博格公式法的创立者是约翰·博格,他是咱们如今投资的指数基金的创始人,第一只指数基金的发明者,被称为“指数基金之父”.并且是世界第二大基金管理公司“先锋集团”的创始人,该公司共掌管了4万多亿美元的资产.

斐波拉契数列的递归、非递归、公式法多种方法实现

实现斐波拉契数列:1,1,2,3,5,8...,当n>=3时,f(n)=f(n-1)+f(n-2). 解:求解斐波拉契数列方法很多,这里提供了4种实现方法和代码,由于第5种数学公式方法代码太过繁琐,只做简单介绍 方法一:递归调用,每次递归的时候有大量重复计算,效率低,可将其调用的过程转化成一颗二叉树进行分析,二叉树的总结点个数不超过(2^n-1)个,由于其是不完全二叉树,那么函数计算的次数必小于(2^n-1),时间复杂度为O(2^n):递归调用的深度为n,空间复杂度为O(n) 方法二:非递归数组

【BZOJ3823】【East!模拟赛_Round5T1】定情信物 推公式+线性筛逆元(推公式法比出题人简)

题解1: 我们定义点为0维元素.线为1维元素.面为2维元素-- 既然一个低维超方体在对应新轴上平移得到高一维的超方体,比如二维超方体为一个面,然后沿新出现的z轴拓展,那么一个低维元素就会增加一维变成高一维的元素,比如点变成线.线变成面.面变成体-- 这样就有一个推式: 高维元素会由第一维的元素衍生.同维元素复制保留, 也就是一个超方体升维之后,高维超方体第i维元素的数量将是原超方体第i维的数量*2+(i-1)维的数量. 然后经过鬼畜的推导/撞大运的找规律,可以得到一个组合数公式, 最后加个线性筛

[问题2014A02] 解答三(降阶公式法)

将矩阵 \(A\) 写成如下形式: \[A=\begin{pmatrix} -2a_1 & 0 & \cdots & 0 & 0 \\ 0 & -2a_2 & \cdots & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ 0 & 0 & \cdots & -2a_{n-1} & 0 \\ 0 & 0 &am

自定义公式法寻找背后影响了科技创新数据的科技政策

区域创新能力是可以量化的,通过统计一个地区各种创新因子,对他们设置不同权值,建立分析模型,就可以对比不同地区的创新能力量化和对比. 那么科技政策对这些创新因子是否起到了导向作用,科技政策的响应与落实效果如何,是我们系统要探究的问题. 区域创新能力包括创新环境.创新资源.企业创新.创新产出和创新绩效.每个分类都有不同的评价指标,通过逆向追溯,一个评价指标是被哪些科技政策所调控的,建立政策调控关键词公式,通过关键词逻辑挖掘,即可找到背后影响科技创新指标数据的那些科技政策. 政策调控关键词公式: [调

FDCT变换 公式法

// 对亮度信号进行FDCT变换// @param   data    亮度信号的存储数组 void CompressEncode::standardFDCT(BYTE data[MATRIXSIZE][MATRIXSIZE]){    BYTE output[MATRIXSIZE][MATRIXSIZE];    double alpha, beta;    short u = 0, v = 0;    short x = 0, y = 0;    for (v = 0; v < MATRIX

51nod 1073约瑟夫环 递归公式法

约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,直到所有人全部出圈为止.当任意给定n和m后,设计算法求n个人出圈的次序.  稍微简化一下. 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 利用数学推导,如果能得出一个通式,就可以利用递归.循环等手段解决.下面给出推导的

环形染色问题(公式法?数列推导?)

一个有N个格子的环,共有M种颜色去涂,相邻格子颜色不同,问共有几种方式 假如随便找一点记为1,按顺序编号,则对于这个环存在两种情况:1.第N-1个格子与第一个格子颜色相同  2.二者颜色不相同 则总方案数就是第一种+第二种--->首先把对N个格子涂色的方案数记为An,则第一种情况下,就相当于在一个N-2个格子环中加入一个格子的种类数即An-2 * (M-1),第二种情况下,就相当于N-1个格子环中加入一个格子的方案数即An-1*(M-1),所以An=(An-2+An-1)*(M-1),可求出其通