Codeforces Round 784 (Div. 4) Kotlin

本期封面原图 画师煮タ 大福豆
最近学了下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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值