SDNU 训练赛(5.13)

SDNU 训练赛(5.13)_第1张图片
SDNU 训练赛(5.13)_第2张图片
思路:看了网上大佬的一种解法,很简洁,就是说:我们要算最后一辆车车头通过停止线的时间,假设,前面的一辆车车对最后一辆车没有影响(前面车通过时间少于它),则时间为s0/v0,但是呢,我们不知道,所以我们就算一下每一辆车通过所用时间,取最大那个就是要求的解,注意对于往前的车辆,我们需要算上车长,(我们要求最后一辆车,前面的车长对于最后一辆来说也是距离)

#include
using namespace std;
typedef long long ll;
const int maxx=2e6+7;

ll l[maxx];
ll s[maxx];
ll v[maxx];
ll sum[maxx];

int main()
{
	int n;
	while(cin>>n)
	{
//	cin>>n;
	for(int i=0;i<=n;i++)
	scanf("%lld",&l[i]);
	for(int i=0;i<=n;i++)
	scanf("%lld",&s[i]);
	for(int i=0;i<=n;i++)
	scanf("%lld",&v[i]);
	
	sum[0]=0;
	double ans=s[0]/(1.0*v[0]);
	for(int i=1;i<=n;i++)
	{
		sum[i]=sum[i-1]+l[i];//前缀和数组保存一下车长
		double t = (sum[i]+s[i])/(1.0*v[i]);
		ans = max(ans,t);
	}
	printf("%.8lf\n",ans);
    }
	return 0;
} 

SDNU 训练赛(5.13)_第3张图片
SDNU 训练赛(5.13)_第4张图片
思维题+水题,就是对有序数处理,注意特值。

#include
using namespace std;
int main()
{
	int n,t;
	cin>>t;
	while(t--)
	{
		int flag;
		cin>>n; 
		if(n<=3) cout<<"-1";
		else
		{ 
		    if(n&1) flag=n;
		    else flag=n-1;
		    for(int i=flag;i>3;i=i-2)
		    cout<<i<<" ";
		    cout<<"3 1 4 2";
		    for(int i=6;i<=n;i=i+2)
		    cout<<" "<<i;
	    }
		cout<<endl;
	}
}

你可能感兴趣的:(ACM)