Kindergarten Physics
确实是幼儿园物理,其实看样例就很容易发现结果的误差是十分小的。只有我这种菜鸡才傻傻地推了半个多小时,ORZ。我们发现,由于G是十分小的,所以不管你的结果如何,它的变化范围都只是在纳米级别的变化,这是在题目的精度范围内的,所以直接输出即可。
反思:对于一些题目,没思路的时候可以打表看看有没有规律
代码:
#include<iostream> using namespace std; int main(){ int T; scanf("%d",&T); double a,b,d,t; while(T--){ scanf("%lf%lf%lf%lf",&a,&b,&d,&t); printf("%.10lf\n",d); } return 0; }
Blow up the Enemy
这个题目既然结果要是胜率最大化,那么我们很容易想到选则择时间最短的那个武器,由于题目的时间范围较小,我们可以对每个输入寻找到相应的时间,然后选择时间最短的即可,同时,我们还要记录下同为时间最短的武器有几个,其它的不要管,因为那是必输,而用时最短的且相同时间的化,那么胜率才会受到影响,我们找到同为用时最短的武器有cnt把,那么结果为.注意精度的损失,输出即可。
代码:
#include<iostream> #include<cstring> using namespace std; int a,d; int inq[10000010]; int main(){ int T; cin>>T; while(T--){ memset(inq,0,sizeof(inq)); int n; cin>>n; int min_t=1e9; for(int i=1;i<=n;i++){ scanf("%d%d",&a,&d); int temp=100; int t=0; while(temp>0){ temp-=a; if(temp<=0) break; t+=d; } if(t<min_t) min_t=t; inq[t]++; } double res=1-(double)inq[min_t]/2.0/(double)n; //控制精度 printf("%.20lf\n",res); } return 0; }
Equal Sentences
这个题目想到了要用到dp,但是想复杂了,然后后面找规律又没有找到,所以遗憾打铁。这题先要看懂题目:
1、我们只可以交换原序列中相邻的元素的位置,也就是这个元素最多在自己原来的位置上左右移动一个位置。
2、如果这两个相邻的位置上的元素是相同的,那就没有必要进行交换位置。
思路其实很简单,就是对这个序列先进行一个遍历,然后进行状态转移,我们用dp[i]表示的是当前的相似句子的个数,举个例子:我把那些单词都转换为数字,更好进行说明:比如有个序列为1,2,3,4,4,5,我们发现当遍历的当前的元素与前一个不相同的时候,我们目前的dp[i]就可以分为这个元素与前面那个元素交换和不交换的情况下的和,交换的情况是dp[i-2],因为你此时的i-1的位置已经改变了,那就只能继承i-2的情况了,不交换的话,那么就是dp[i-1],也就是从i-1的那个状态每种情况都加上这个元素在最后面。但是,我们发现,对于如果和前面那个相同的话,我们就没有必要进行交换,也就是直接继承dp[i-1]即可,所以,我们得到状态转移方程为:
注意初始化和结果取模即可。
代码:
#include<iostream> #include<cstring> using namespace std; const int mod=1e9+7; int dp[100010]; string ss[100010]; int main(){ int t; scanf("%d",&t); while(t--){ memset(dp,0,sizeof(dp)); int n; cin>>n; for(int i=1;i<=n;i++) cin>>ss[i]; dp[1]=1; dp[0]=1; for(int i=2;i<=n;i++){ if(ss[i]!=ss[i-1]){ dp[i]=(dp[i-1]+dp[i-2])%mod; } else dp[i]=dp[i-1]; } printf("%d\n",dp[n]); } return 0; }