2020-2-12新生赛

问题 B: 自由落体

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1。在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 d=1/2*g*(t^2),其中 g=10,t 为下落时间。地面上的小车以速度 V 前进。

如下图:

小车与所有小球同时开始运动,当小球距小车的距离 <= 0.0001(感谢Silver_N修正) 时,即认为小球被小车接受(小球落到地面后不能被接受)。

请你计算出小车能接受到多少个小球。

输入

H,S1,V,L,K,n (l<=H,S1,V,L,K,n <=100000)

输出

小车能接受到的小球个数。

样例输入 Copy

5.0 9.0 5.0 2.5 1.8 5

样例输出 Copy

1

题目关键就是车子能在的范围【q,hr】;

不能落地所以【q+0.0001,hr-0.0001】;

#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
 
int main()
{
  double  h,s1,v,l,k;
  int n;
  scanf("%lf%lf%lf%lf%lf",&h,&s1,&v,&l,&k);
  scanf("%d",&n);
 double hr=s1+l-sqrt((h-k)/5.0)*v;
 double q=s1-sqrt((h)/5.0)*v;
 //printf("hr:%f",hr);
 //printf("\nq:%f\n",q);
 int ans=0;
 for(int i=0;i<n;i++)
 {
    if((hr-i)>=0.0001&&(q-i)<=0.0001) ans++;
 }
 printf("%d",ans);
    return 0;
}
 
/**************************************************************
    Problem: 3503
    User: 2019UPC110
    Language: C++
    Result: 正确
    Time:1 ms
    Memory:2036 kb
****************************************************************/

问题 G: 工作分配

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

在工厂里,如果每道工序让不同的工人来做,所要花费的时间往往不一样。精明的老板为了提高效率,总是把生产某一产品所需要的N道工序进行最佳搭配,使生产某一产品所花费的总时间最少。现在就给出N个工人分别做N道工序所要花费的时间,请你来计算一下,如果N个工人每人做N道工序中其中的一道,那么生产某一产品(即完成所有N道工序)所要花费的最少时间是多少。

输入

第1行有1个整数N(1≤N≤20),表示有N个工人。接下来的N行,每行N个数,表示该工人完成各道工序所要花费的时间。

输出

共一行,即生产某一产品所要花费的最少时间。

样例输入 Copy

4
1 3 2 4
3 2 4 5
3 4 1 2
4 5 3 2

样例输出 Copy

6

回族法

//第一次dfs超时的时候的代码
#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int A[25][25];
int vis[25],ans=1e9,n;
void dfs(int num,int time)
{
    for(int i=1;i<=n;i++)
    {
        if(vis[i]) continue;
        if(num==n)
        {
            ans=min(ans,time+A[num][i]);
        }
        else{
        vis[i]=1;
        dfs(num+1,time+A[num][i]);
        vis[i]=0;
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
           scanf("%d",&A[i][j]);
        }
    }
    dfs(1,0);
    printf("%d",ans);
 
    return 0;
}
 
/**************************************************************
    Problem: 10259
    User: 2019UPC110
    Language: C++
    Result: 时间超限
****************************************************************/
#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int A[25][25];
int vis[25],ans=1e9,n;
void dfs(int num,int time)
{
    for(int i=1; i<=n; i++)
    {
        if(vis[i])
            continue;
        if(num==n)
        {
            ans=min(ans,time+A[num][i]);
            break;
        }
        else
        {
            if(ans>=time+A[num][i])/////这个就是回溯法。。。。就是下一步不行我们就不去,返回到上一bu
            {
                vis[i]=1;
                dfs(num+1,time+A[num][i]);
                vis[i]=0;
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            scanf("%d",&A[i][j]);
        }
    }
    dfs(1,0);
    printf("%d",ans);

    return 0;
}
发布了32 篇原创文章 · 获赞 1 · 访问量 1334

猜你喜欢

转载自blog.csdn.net/QXK_Jack/article/details/104286206