啦啦啦,我现在已经能ak校赛啦,啦啦,一年没白学(大雾)
A:DLK的魔法
分析:这题直接逆推,每次将当前数字尽量变成一个平方数,然后直接平方,直到1
思路:尽量少使用+1操作,就是最优方案,那么就是尽量多平方操作,那么逆推的时候,每次尽量造出平方数
代码:
ll n,a,b,c;
int main()
{
cin>>n;
if(n<=2)
cout<<n<<"\n";
else
{
do
{
if(c && n-c*c)
{
b+=n-c*c+1;
n=c;
}
else
if(c)
{
b+=1;
n=c;
}
c=sqrt(n);
}while((n-c*c || c-1));
cout<<b<<"\n";
}
return 0;
}
B:DLK的题册
分析:?都/2算下呗
代码:
ll a,b;
int main()
{
cin>>a>>b;
a/=2,b/=2;
a-=b;
if(a>0)
{
cout<<"forward "<<a<<"\n";
}
else
if(a==0)
{
cout<<"right here\n";
}
else
{
cout<<"backward "<<-a<<"\n";
}
return 0;
//4 5
//2 3
//1
}
C:DLK的队伍
分析:从小到大排一下,每次选第一个,做完了
代码:
ll a[maxn],n,asd,num;
int main()
{
cin>>n;
rep(i,1,n+1)
cin>>a[i];
sort(a+1,a+n+1);
int l=1;
rep(i,1,n+1)
{
num++;
if(num==a[l])
{
asd++;
num=0;
l=i+1;
}
}
if(num)
asd++;
cout<<asd<<"\n";
return 0;
}
D:DLK的计算器
分析:一开始还以为是个栈,要写后缀表达式之类的,然后发现就一个值每次加减就行
代码:
ll n,x,a;
string s1;
int main()
{
cin>>n;
while(n--)
{
cin>>s1;
switch(s1[1])
{
case '+':{
cin>>x;
a+=x;
break;
}
case 'S':{
cin>>x;
a=x;
break;
}
case 'R':{
cout<<a<<"\n";
break;
}
case '-':{
cin>>x;
a-=x;
break;
}
case 'C':{
a=0;
break;
}
}
}
return 0;
}
E:DLK的游戏
分析:小博弈,最后一堆无意义,看前面的即可,1的时候状态转换,不是1的时候结果已经固定了
代码:
ll n,x,a;
string s1;
int main()
{
cin>>n;
n--;
while(n--)
{
cin>>x;
if(x==1)
a^=1;
else
{
if(a)
cout<<"KDL\n";
else
cout<<"DLK\n";
return 0;
}
}
if(a)
cout<<"KDL\n";
else
cout<<"DLK\n";
return 0;
}
F:DLK的房子
分析:
1000*1000,暴力呗
代码:
int a[maxn];
int val[maxn];
int n,m,q,l,l1,b;
int main()
{
cin>>n>>m;
rep(i,1,n+1)
{
cin>>q;
l=0;
l1=0;
while(q--)
{
cin>>b;
l1=l;
l+=b;
rep(i,l1+1,l)
{
if(a[i])
{
val[a[i]]++;
a[i]=0;
}
}
if(l!=m)
a[l]++;
}
}
rep(i,1,m+1)
{
if(a[i])
{
val[a[i]]++;
a[i]=0;
}
}
rep(i,1,n+1)
{
cout<<val[i]<<" ";
}
cout<<"\n";
return 0;
}
G:DLK的照片
分析:emm,直接输出呗。。。
代码:
db a,b,c,d;
int main()
{
cin>>a>>b>>c>>d;
d=d*a-b*c;
if(d<0)
{
//这是不是要判eps来的,emmmm
d=0;
}
else
d/=a;
cout<<fixed<<setprecision(6)<<d<<"\n";
return 0;
}
H:DLK的地图
分析:n和m就500,直接遍历
代码:
int n,m;
int dx[4]={
1,-1,0,0};
int dy[4]={
0,0,1,-1};
char fx[4]={
'D','U','R','L'};
int a[maxn][maxn];
char b[maxn][maxn];
bool check(int x,int y)
{
if(x<1 || x>n || y>m || y<1)
return false;
return true;
}
void work()
{
rep(i,1,n+1)
{
rep(j,1,m+1)
{
if(a[i][j]==0)
b[i][j]='X';
else
{
rep(z,0,4)
{
int x1=i+dx[z];
int y1=j+dy[z];
if(check(x1,y1))
{
if(a[x1][y1]==-1)