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