内网比赛 后面几题自己看课本 一下题解为外网和内网前几题题解
A
这题需要考虑的问题是:该怎样放人、载人才能到达B地且时间最少,仔细想想,只用在某一个地方放人下去(就是说只用交换一次)。
现在的问题就变为了:该在哪个地方放人下去,带回终点,两人一起到终点,时间最少(首先车带一个人行驶一段距离然后丢下,折回找另外一个人,半路碰上,带回终点刚好与第一人共到B点)
这样问题就好解决了,设那个放下的点为x,那么就有:(s-x)/a=2*(2*x/(a+b)-x/b)+(s-x)/b
化简得:x=(b+a)*s/(b+3a)
既然放下的那个点已经确定好了,那么时间也简单了,时间为:x/b+(s-x)/a,(x/b)为那个点前一段所用的时间,[(s-x)/a]为那个点后一段所用的时间。
#include<bits/stdc++.h>
using namespace std;
int main(){
double n, a, b;
scanf("%lf%lf%lf", &n, &a, &b);
double m = (b + a)/(b - a);
double x = 2 * m + 1;
double y = 2 * a * m + 2 * a + b;
double t = x * n / y;
printf("%.6f\n", t);
return 0;
}
B
排序 设置两个指针 一个从头一个从尾部 向中间扫描 看有几种方案
#include <iostream>
#include <algorithm>
using namespace std;
#define mo 1000005
int a[mo];
int main()
{
int n,m;
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
int l=0,r=n-1;
int ans=0;
int sum=0,k=0;
while(l<=r)
{
ans=0;
for(;r>l;r--)
{
if(ans+a[r]<=m) ans+=a[r];
else break;
}
for(;l<=r;l++)
{
if(ans+a[l]<=m) ans+=a[l];
else break;
}
sum+=m-ans;
k++;
}
cout<<sum<<' '<<k<<endl;
}
}
C
暴力搜索
#include<iostream>
#include<string>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdio>
using namespace std;
int d[10];
int tag[10];
int sum;
int dp[10000005];
void run()
{
int x=0,y=0,z=0;
for(int i=1;i<=9;i++)
{
x=x*10+tag[i];
y=0;
for(int j=i+1;j<=9;j++)
{
y=y*10+tag[j];
z=0;
//cout<<i<<' '<<j<<' '<<endl;
if(j-i>=9-j&&j<9)
{
for(int k=j+1;k<=9;k++)
{
z=z*10+tag[k];
}
//cout<<x<<' '<<y<<' '<<z<<' '<<x<<' '<<y/z<<endl;
if(z==0||y<z) continue;
if(y%z==0) dp[x+y/z]++;
}
}
}
}
void bfs(int t,int x,int s)
{
tag[x]=s;
if(t==9)
{
run();
//for(int i=1;i<=9;i++)cout<<tag[i]<<' ';cout<<endl;
sum++;
}
for(int i