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);
}