A - The Fool
题意:
求解∑N/[1,N],问最后的结果是奇数还是偶数?如果是奇数输出odd,否则输出even。
做法:
表示蒟蒻博主打了个表,以sqrt(n)为分界线,前半部分正常算,后半部分则-=前半部分的两个相邻数据之差×当前下标。原理名叫做整数分块,有原题
推荐去这位dalao的博客研究:https://blog.csdn.net/qq_43472263/article/details/100154536
做完之后室友在耳边低语:那是个等差数列,直接用sqrt(n)判断奇偶就行了,有个*还去搞什么整数分块,有*但是我不说!。。。。。。QAQ!!!蒟蒻博主直接哭爆,可惜了这么好的题呀,被我这么霍霍了。
下面博主要丢人现眼了,直接判断奇偶的代码一度一大堆,博主就不上了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e5+10;
int main()
{
ios::sync_with_stdio(false);
int t,n,ca=0;
cin>>t;
while(t--)
{
ll ans=0;
ll m;
ca++;
cin>>n;
m=sqrt(n*1.0);
for(int i=1;i<=m;i++)
{
ans+=(n/i);
ans+=(n/i-(n/(i+1)))*i;
}
if(n/m==m)
ans-=m;
if(ans&1)
cout<<"Case "<<ca<<": odd"<<endl;
else
cout<<"Case "<<ca<<": even"<<endl;
}
return 0;
}
/**
1/1=1
2/1+2/2=3
3/1+3/2+3/3=3+2+1=6
4/1+4/2+4/3+4/4=4+2+2+1=9
5/1+5/2+5/3+5/4+5/5=5+3+2+2+1=13
6/1+6/2+6/3+6/4+6/5+6/6=6+3+2+2+2+1=16
7/1+7/2+7/3+7/4+7/5+7/6+7/7=7+4+3+2+2+2+1=21
8/1+8/2+8/3+8/4+8/5+8/6+8/7+8/8=8+4+3+2+2+2+2+1=24
9/1+9/2+9/3+9/4+9/5+9/6+9/7+9/8+9/9=9+5+3+3+2+2+2+2+1=29
*/
B - The World
题意:
给了四个地点:北京,伦敦,莫斯科以及华盛顿,并且给了这些地方的时区,现在给定一个时间点,你所在的城市以及你即将前往的城市,问你即将去往的城市现在的时间和你目前所在的城市的时间差距是多少?
做法:
大模拟!冲就完了,用map去存四个城市的时区,然后对于AM/PM进行特判,将小时数进行改变,注意处理细节!分钟不用管!!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e5+10;
int main()
{
ios::sync_with_stdio(false);
int t,n,ca=0;
map<string,int>mp;
mp["Beijing"]=8,mp["Washington"]=-5,mp["London"]=0,mp["Moscow"]=3;
cin>>t;
while(t--)
{
ca++;
int h=0,m=0;
bool flag1=false,flag2=false;
string s,ch,Sta,End,data1="Today",data2="Yesterday",data3="Tomorrow";
cin>>s>>ch>>Sta>>End;
//cout<<s<<endl;
int i=0;
while(s[i]!=':')
h=h*10+s[i]-'0',i++;
i++;
while(i<s.size())
m=m*10+s[i]-'0',i++;
if(h==12)
h=0;
if(ch=="PM")
h+=12;
h+=mp[End]-mp[Sta];
cout<<"Case "<<ca<<": ";
if(h<0)
{
cout<<data2<<" ";
h+=24;
if(h>=12)
h-=12,ch=" PM";
else
ch=" AM";
}
else if(h>=24)
{
cout<<data3<<" ";
h-=24;
if(h>=12)
ch=" PM";
else
ch=" AM";
}
else
{
cout<<data1<<" ";
if(h>=12)
h-=12,ch=" PM";
else
ch=" AM";
}
if(!h)
h=12;
if(m<10)
cout<<h<<":0"<<m<<ch<<endl;
else
cout<<h<<":"<<m<<ch<<endl;
}
return 0;
}
/**
*/
F - The Hermit
题意:
有n座信号塔,每座信号塔的照亮范围为[i−radi+1,i+radi−1],其他信号塔能收到该灯塔当且仅当它的位置在该信号塔的范围内。 并且有i−radi+1≤i+1−radi+1+1 现在对于每座灯塔i,要求找出有多少座灯塔k满足要求:
- k<i,并且k能收到i的信号
- 并且存在k≤j<i,k和i都可以收到j的信号,并且k→j的距离要大于等于j→i的距离
做法:
对于每一座灯塔i的左边范围内的电台,首先除了电台本身以及左边第一以外,其余的灯塔都可以接受i的信号?让我们来列举一下k满足的情况:
- k<i
- i包含k
- 存在电台j满足:1、k<=j<i。2、dis(j,k)>=dis(i,j)(dis(x,y)表示x到y的距离)3、j包含k
假设j=i-1,则i−radi+1<=k<=i-2满足了条件1,2,3.1,且j-k=(i-1)-k>=1,i-j=i-(i-1)=1,所以j到k的距离大于j到i的距离,最后根据题意i−radi+1≤i+1−radi+1+1(意味着如果看k<i且i包含k,则对于任意k<=j<=i,满足j包含k)
所以最后的结果为每个电台i左边覆盖的电台数a[i]-2就是答案,所以题目最后其实就是对于每一个a[i]-2求异或。
E - The Tower
题意:
一个点位于(x0,y0,z0)以速度(vx,vy,vz),求t时间到达椎体上面。
做法:
又是计算几何。。。。
- x=x0+vx*t;
- y=y0+vy*t;
- z=z0+vz*t;
- x0^ 2 + y0^ 2 =((h-z)/r)^2;该方程为圆锥方程:
四元方程组,将四个式子进行联立求解得出答案。。。可以考虑这个博客传送门
说个注意点:数据类型一定要定好!!!关于某蒟蒻博主居然把两个输入lf的变量定成了int导致WA了两发的这件事情,还是不看了吧!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e7+10;
const ll INF=1e18;
int T,ca;
double vx,vy,vz,x,y,z,r,h;
bool check(double a)
{
double xx,yy,zz;
xx=x+vx*a;
yy=y+vy*a;
zz=z+vz*a;
if(zz>=0&&zz<=h&&(xx*xx+yy*yy)<=r*r)
return 1;
return 0;
}
int main()
{
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
scanf("%lf%lf",&r,&h);
scanf("%lf%lf%lf%lf%lf%lf",&x,&y,&z,&vx,&vy,&vz);
double a,b,c,lmt,ans=1e18,tmp1=0,tmp2=0;
a=h*h*vx*vx+h*h*vy*vy-r*r*vz*vz;
b=2*(h*h*vx*x+h*h*vy*y+r*r*h*vz-r*r*z*vz);
c=h*h*x*x+h*h*y*y-h*h*r*r-r*r*z*z+2*r*r*h*z;
lmt=b*b-4*a*c;
tmp1=(-b+sqrt(lmt))/(2.0*a);
tmp2=(-b-sqrt(lmt))/(2.0*a);
//cout<<tmp1<<" "<<tmp2<<endl;
if(check(tmp1))
ans=min(ans,tmp1);
if(check(tmp2))
ans=min(ans,tmp2);
printf("Case %d: ",i);
printf("%.10f\n",ans);
}
return 0;
}
每日小结:
这是做CCPC训练的第三次吧,第一次的江西做的贼开心,第二次的秦皇岛到现在还在脑淤血,现在的吉林又一次成功的让我领教了啥叫:学好数理化,走遍天下都不怕!还有半个月就去打星比赛了!愿所有的WA都由我llm事先尝试,希望半个月后的比赛都能打好呀!Thanks♪(・ω・)ノ,今天就让博主偷个懒吧,不优化界面先了,属实是累了!QAQ