A. Save Luke

题意:给一个人的长度d,然后给一个区间长度0~L,给你两个子弹的速度v1,v2,两颗子弹从0和L向中间射去(其实不是子弹,是一种电影里面那种绞牙机之类的东西就是一个人被困在里面了,两边有着那种尖刺的墙向中间靠拢的那种)问Luke能存活的最长时间

思路:看代码吧,简单易懂

 #include<cstdio>
#include<cmath>
int main()
{
int d,l,v1,v2;
while(scanf("%d%d%d%d",&d,&l,&v1,&v2)!=EOF)
{
printf("%.6lf\n",(l-d)*1.0/(v1+v2));
}
}

B. Making a String

题意:26个字母组成的串,给你字母的数量和每个字母可以放的数量,组成串的时候有一定规则:

1.串中每个字母的数量不能多于给定的数量

2.串中每个字母出现的次数都不同

问组成的最长串是多少。

思路:因为涉及的是不同的元素,所以用set来做,

先贴一个WA在第20组数据的代码

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
long long num[],sum[];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
set<long long>p;
long long tot=;
for(int i=;i<n;++i)
scanf("%lld",&num[i]);
sort(num,num+n);
for(int i=n-;i>=;--i){
while(p.find(num[i])!=p.end()){
num[i]-=;
}
p.insert(num[i]);
tot+=num[i];
}
printf("%lld\n",tot);
}
}

这个代码呢,在while循环中num[i]可能减为负数,所以输入3 1 1 1 答案本来是1的但输出来是0

所以要对负数做一个判断

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
long long num[],sum[];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
set<long long>p;
long long tot=;
for(int i=;i<n;++i)
scanf("%lld",&num[i]);
sort(num,num+n);
for(int i=n-;i>=;--i){
while((p.find(num[i])!=p.end())){
num[i]-=;
}
if(num[i]<) num[i]=;
p.insert(num[i]);
tot+=num[i];
}
printf("%lld\n",tot);
}
}

这样就可以了

错误代码贴这里是为了提醒自己针对一个问题针对自己的代码要做到没有漏洞可以找、

05-11 18:33