几个题解(

A.小车问题   P1258 小车问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

xd,看到题时还有点庆幸。。。想着之前在学二分时心血来潮搜标签的时候好像见过,很兴奋的开始敲。。。一个劲庆幸“思维”是知道的。。。现在看.....评价是。就是个奥数题.....不值的用那么久来磕二分23333

  • 可以画一个图,来研究一下,车带人走,甲乙之间的距离,车乙相遇时,甲所走路程,等于接下来我要研究的就是,甲何时下车,能够让甲乙同时到达终点
  • 假设甲下车时,距离起点为p=s/2;
  • 因为,一开始,甲乘车,所以甲到达所用的时间为a=p/v2。
  • 然后甲下车,车去接乙,乙和车为相遇,在甲下车前,乙也在一直走。走了a*v1距离所以车和乙相遇的时间是b=(p-a*v1)/(v1+v2);
  • t1(甲)=a+(s-p)/v1;
  • t2(乙)=a+b+(s-(a+b)*v1)/v2;
  • 若t1<t2,则甲多坐,应该早下;若t1<t2,则甲多坐,应该早下,就把区间稍作改变,让我刚开始定义的下车点做为右端点,再二分,在新的区间内去判断何时下车。t2>t1时,同理。
#include<csdio>
#include<cmath>
int main()
{
	double s,s1,s2,v1,v2,t1,t2,p;
	
	scanf("%lf%lf%lf",&s,&v1,&v2);
	s1=0;
	s2=s;
	do
	{
		p=(s1+s2)/2.0;
		a=p/v2;
		b=(p-a*v1)/(v1+v2);
		t1=a+(s-p)/v1;
		t2=a+b+(s-(a+b)*v1)/v2;
		if(t1<t2)
		  s2=p;
		else
		  s1=p;	
	} 
	while(fabs(t1-t2)>1e-8);
	printf("%.6lf",t1);
	return 0;
}

B.笨小猴

P1125 [NOIP2008 提高组] 笨小猴 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
//素数
int f(int x)
{
	for(int i=2;i<=x/2;i++)
		if(x%i==0) return 0;
	return 1;
}
int main()
{
	char a[101],b[26]={};//b数组初始化为0 
	cin>>a;
	int len=strlen(a);	
	for(int i=0;i<len;i++) 
	{	
		 b[a[i]-97]++; //a对应0 z对应25
	}
	int max=-1,min=101;	//初始化最大最小值 
	for(int i=0;i<26;i++)//遍历b数组 
	{
		if(b[i]>max) max=b[i]; //最大值 
		if(b[i]!=0 &&b[i]<min) min=b[i];//0除外的最小值  
	}

	if( f(max-min) &&(max-min)>1 ) //0跟1不是素数
		cout<<"Lucky Word"<<endl<<max-min;
	else
		cout<<"No Answer"<<endl<<"0";
}
  • a[i] 表示输入单词中第 i 个字符,a 是输入单词的字符数组。
  • 'a' 的 ASCII 码是 97,因此 'a' - 97 = 97 - 97 = 0,所以 b[0] 对应字母 'a'
  • 'z' 的 ASCII 码是 122,因此 'z' - 97 = 122 - 97 = 25,所以 b[25] 对应字母 'z'
  • 因此,b[a[i]-95]++ 的作用是将对应字母在数组 b 中的位置上的计数加一,以统计每个字母出现的次数。

  • 将max 初始化为 -1 ,是为了确保后续比较中任何大于等于 0 的值都能覆盖到,而将 min 初始化为 101 ,则是为了确保后续比较中任何小于等于 100 的值都能覆盖到。

  • 至于质数判断,如果为了简便,可以考虑看看埃式质数筛(如果要判断的质数很大的话,这个不容易爆掉(

C. 拯救oibh总部

P1506 拯救oibh总部 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

看看题解吧。。。自己写的测试点过不去23333.

  • dfs+记忆化搜索

D.明明的随机数

P1059 [NOIP2006 普及组] 明明的随机数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

桶排再来个计数器。轻松搞定

#include <bits/stdc++.h>//头文件
using namespace std;
int main() 
{
    bool a[1001]={0};//桶
    int n,i,x;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>x;
        a[x]=1;//统计去重
    }
    n=0;//计数器
    for(i=1;i<=1000;i++)
    {
        if(a[i]==1)  n++;
    }
    cout<<n<<endl;
    for(i=1;i<=1000;i++)
    {    
        if(a[i]==1) cout<<i<<" ";
    }
    return 0;
}

E.小A的糖果

贪心。

P3817 小A的糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <bits/stdc++.h>
using namespace std;
long long n, x, sum, a[100009];

int main()
{
	scanf("%lld %lld", &n, &x);
	for (int i = 0; i <= n; i ++ )
	{
		scanf("%lld ", &a[i]);
	}
	for (int i = 0; i < n; i ++ )
	{
		if (a[i] + a[i + 1] > x)
		{
			sum = sum + a[i] + a[i + 1] - x;
			a[i + 1] = x - a[i];
		}
	}
	printf("%lld\n", sum);
}

  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值