本期封面原图 画师煮タ 大福豆
最近学了下Kotlin的基础语法 想着巩固一下就开了一把div4 最后几题没时间了还是换回了C++ 要不然没法AK了
Idea编译的时候最后必须加上一句main函数的调用,但是cf的测评机又不能加这一句,总是忘记注释掉所以ce了很多发,引以为戒喵
昨天打的 但是今天想了想还是把题解补一下吧
A - Division?
题意
输入一个分数输出他的division,可能当年cf的rated规则是这样?我只知道现在codechef是这个规则
思路
直接依照题意判断即可
语法tips
Kotlin的if和else if的用法和C基本相同,从控制台读入数据的方式和python基本相同,定义方式比python多了个var和val,相当于C语言加不加const,而且要求定义的时候必须赋值
代码
import java.util.*
fun solve()
{
var n = readLine()!!.toInt()
if(n>=1900)
println("Division 1")
else if(n>=1600)
println("Division 2")
else if(n>=1400)
println("Division 3")
else
println("Division 4")
}
fun main()
{
var t = readLine()!!.toInt()
while(t-- > 0)
{
solve()
}
}
//main()
B - Triple
题意
读入一个数组,输出任意出现次数大于等于3的数字,没有的话就输出-1
语法tips
定义一个数组是var b = IntArray(n+1)
,也就是定义一个长度为n+1的数组,默认所有位置的值都是0,for循环遍历的方式类似python
println会自动加一个回车,print就不会
代码
import java.util.*
fun solve()
{
var n = readLine()!!.toInt()
var a = readLine()!!.split(" ").map{it.toInt()}.toIntArray()
//数组的定义
var b = IntArray(n+1)
for(i in a)
{
b[i]++
}
var ans=-1;
for(i in 1..n)
{
if(b[i]>=3)
{
ans=i;
break;
}
}
println(ans)
}
fun main()
{
var t = readLine()!!.toInt()
while(t-- > 0)
{
solve()
}
}
//main()
C - Odd/Even Increments
题意
每次操作可以对所有奇数位或所有偶数位的值加一,问能否以任意次操作使得整个数组的所有数奇偶性想通过
思路
看是不是奇数和偶数位分别奇偶性相同即可
语法tips
可以用step后面跟一个数字来控制循环的步长
代码
import java.util.*
fun solve()
{
var n = readLine()!!.toInt()
var a = readLine()!!.split(" ").map{it.toInt()}.toIntArray()
for(i in 2 until n step 2)
{
if(a[i]%2!=a[0]%2)
{
println("NO")
return
}
}
for(i in 3 until n step 2)
{
if(a[i]%2!=a[1]%2)
{
println("NO")
return
}
}
println("YES")
}
fun main()
{
var t = readLine()!!.toInt()
while(t-- > 0)
{
solve()
}
}
main()
D - Colorful Stamp
题意
原本的字符串全部都是W,每次可以将连续的两个字符变为RB或者BR,问最终有没有机会变为给定的字符串形式
思路
以W把字符串拆开成好几段,每一段都必须出现过R和B,如果一段只出现某一个字符那肯定不行
语法tips
kotlin的if里面一定要对每个判断加括号,要不然容易报错,至少我总是会莫名其妙报错
代码
import java.util.*
fun solve()
{
var n = readLine()!!.toInt()
var s = readLine()!!
var B=0
var R=0
for(i in 0 until n)
{
if(s[i] == 'B')
{
B++
}
else if(s[i] == 'R')
{
R++
}
else
{
if(B==0 && R==0)
continue
if(R>0 && B>0)
{
B=0
R=0
continue
}
break
}
}
if(((B<=0)&&(R>0))||((R<=0)&&(B>0)))
{
println("NO")
}
else
{
println("YES")
}
}
fun main()
{
var t = readLine()!!.toInt()
while(t-- > 0)
{
solve()
}
}
//main()
F - Eating Candies
题意
两个人一个从左往右一个从右往左吃糖,要求最后吃的一样多,问两个人最多能吃多少糖
思路
双指针模拟即可
语法tips
用max和min要引用math库
代码
import java.util.*
import kotlin.math.*
fun solve()
{
var n = readLine()!!.toInt()
var a=readLine()!!.split(' ').map{it.toInt()}
var l=0
var r=n-1
var pre=0
var back=0
var ans=0
while(l<=r)
{
pre+=a[l]
while(r>l && back<pre)
{
back+=a[r]
r--
}
if (back==pre)
{
ans=max(ans,l+n-r)
}
l++
}
println(ans)
}
fun main()
{
var t = readLine()!!.toInt()
while(t-- > 0)
{
solve()
}
}
//main()
E - 2-Letter Strings
题意
输入n个长度为2的字符串,问一共有多少对只有某一位的字符相同
思路
遍历每一位即可
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void solve()
{
int n;
scanf("%d",&n);
ll ans=0;
string s;
int cnt[26][26];
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++)
{
cin>>s;
int x=s[0]-'a';
int y=s[1]-'a';
for(int j=0;j<26;j++)
{
if(x!=j)
{
ans+=cnt[j][y];
}
if(y!=j)
{
ans+=cnt[x][j];
}
}
cnt[x][y]++;
}
printf("%lld\n",ans);
}
int main()
{
int T=1;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
G - Fall Down
题意
模拟石头往下掉的过程,只要下面还是空的就要一直往下掉
思路
从下往上模拟即可
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void solve()
{
int n,m;
scanf("%d%d",&n,&m);
string s[n+1];
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]=" "+s[i];
}
printf("\n");
for(int i=n;i>=1;i--)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='*')
{
s[i][j]='.';
bool flag=false;
for(int k=i;k<=n;k++)
{
if(s[k][j]=='*' or s[k][j]=='o')
{
s[k-1][j]='*';
flag=true;
break;
}
}
if(!flag)
s[n][j]='*';
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("%c",s[i][j]);
}
printf("\n");
}
}
int main()
{
int T=1;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
H - Maximal AND
题意
每次操作可以使某一个数的某一个二进制位变成1,问最后数组中所有数and值的最大值
思路
贪心,从最高位往下尽量都变成1就行
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void solve()
{
int n,k;
scanf("%d%d",&n,&k);
int a[31];
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
for(int j=0;j<=30;j++)
{
if(x&(1<<j))
{
a[j]++;
}
}
}
int ans=0;
for(int i=30;i>=0;i--)
{
if(k>=n-a[i])
{
k-=n-a[i];
ans|=1<<i;
}
}
printf("%d\n",ans);
}
int main()
{
int T=1;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}