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;
}