102263 - ArabellaCPC 2019(部分)解题报告

link
A - Is It Easy ?
easy

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=1e5+5;
ll n,k;
 
int main(){
    cin>>n>>k;
    cout<<n*k;
    return 0;
}

B - Road to Arabella
当只能选择1的时候是能确定胜负局面的时候。假如 k = = n k==n k==n k = = n − 1 k==n-1 k==n1,则一开始就确定了胜负,n偶Kilani负,n奇Kilani胜。假如k<n-1,Kilani先手,可以选择一个数使m为偶数,且之后的回合都只能选1,必胜。

#include<bits/stdc++.h>
using namespace std;
int T;
int main(){
    scanf("%d",&T);
    while (T--)
    {
        int n,m;
        bool flag;
        scanf("%d%d",&n,&m);
        if(m>=n-1){
            if(n%2==0) flag=false;
            else flag=true;
        }
        else flag=true;
        if(flag)
            cout << "Kilani" << endl;
        else
            cout << "Ayoub"<<endl;
    }
}

C - Check The Text
用队列表示输入字符串,然后匹配即可。

#include<bits/stdc++.h>
using namespace std;
queue<string> qq;
deque<char> st;
int n,m;
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        string temp;
        cin>>temp;
        qq.push(temp);
    }
    scanf("%d",&m);
    bool cc=false;
    for(int i=0;i<m;i++){
        string temp;
        cin>>temp;
        if(temp.length()>1){
            if(temp[0]=='B'){
                if (!st.empty())
                    st.pop_back();
            }
            else if(temp[0]=='C'){
                cc=!cc;
            }
            else{
                st.push_back(' ');
            }
        }else{
            char c=temp[0];
            if(cc) c=c-32;
            st.push_back(c);
        }
    }
    string com="";
    string org="";
    while(!qq.empty()){
        org+=qq.front();
        qq.pop();
        if(!qq.empty())
            org+=' ';
    }
    while (!st.empty())
    {
        com+=st.front();
        st.pop_front();
    }
    bool res=true;
    if(org.size()!=com.size()) res=false;
    else{
        for(int k=0;k<org.size();k++){
            if(org[k]!=com[k]){
                res=false;
                break;
            }
        }
    }
    if (res)
        cout << "Correct" << endl;
    else
        cout << "Incorrect" << endl;
    return 0;
}

D - Meeting Bahosain
假如这个数列最终能相等,那么他们之间可以任意转化。假如能把a[0]变成a[1]……a[n-2]变成a[n-1],这个数列最终就能相等。假如能相等,每个元素都能表示成 a [ x ] = a [ x − 1 ] + k 1 ∗ b [ 0 ] + k 2 ∗ b [ 1 ] + … … k n − 1 ∗ b [ n − 1 ] a[x]=a[x-1]+k1*b[0]+k2*b[1]+……kn-1*b[n-1] a[x]=a[x1]+k1b[0]+k2b[1]+kn1b[n1] a [ x ] − a [ x − 1 ] = k ∗ g c d ( b ) a[x]-a[x-1]=k*gcd(b) a[x]a[x1]=kgcd(b)。则若a中所有元素的最大公约数若能被所有b中所有元素的最大公约数整除就可以转化。

#include <bits/stdc++.h>
using namespace std;
int n, m;
int main()
{
    scanf("%d%d", &n, &m);
    int g1, g2;
    for (int i = 0; i < n; i++)
    {
        int temp;
        scanf("%d", &temp);
        if (!i)
            g1 = temp;
        else
            g1 = __gcd(g1, temp);
    }
    for (int i = 0; i < m; i++)
    {
        int temp;
        scanf("%d", &temp);
        if (!i)
            g2 = temp;
        else
            g2 = __gcd(g2, temp);
    }
    if (g1 % g2  == 0||n==1)
        printf("Yes\n");
    else
        printf("No\n");
    return 0;
}

G - Card Game
对于选择的i,只有对手选择1~i-1时才能得分,所以期望是对于所有i,i*(i-1)/n的和。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    scanf("%d",&n);
    double ans=0;
    for(int i=1;i<=n;i++){
        ans=ans+i*1.0*(i-1)/n;
    }
    printf("%.6lf",ans);
    return 0;
}

H - Steaks

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll n,m;
    cin>>n>>m;
    if(n<=2*m) printf("10\n");
    else{
        ll ans=(2*n)/(2*m);
        if ((2 * n) % (2 * m)) ans++;
        ans*=5;
        cout<<ans<<endl;
    }
    return 0;
} 

I - Bashar and Hamada
排好序后。选两个时,一定选头尾两个,选第三个的时候选谁都一样,选第四个的时候的增量就相当于选第三个的时候的增量+第四个与第三个之差,所以三、四也要从头尾选。以此类推,每次都从头尾选。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int arr[300000];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int temp;
        scanf("%d",&temp);
        arr[i]=temp;
    }
    sort(arr,arr+n);
    ll ans=arr[n-1]-arr[0];
    ll b1=ans;
    ll b2=2*ans;
    cout<<b1<<" ";
    if(n>2)
        cout<<b2<<" ";
    for(int i=4;i<=n;i++){
        ll rec = b2;
        if(i%2!=0){
            b2 = -b1 + 2*b2;
        }
        else{
            b2=-b1+2*b2+arr[n-i/2]-arr[i/2-1];
        }
        b1 = rec;
        cout<<b2<<" ";
    }
    cout<<endl;
    return 0;
}

J - Thanos Power
考虑每位数如何构成

  1. 直接加 步骤n
  2. 借位 前一位不是借位得到的 步骤10-n+1
  3. 借位 前一位是借位得到的 步骤10-n-1 (减掉上一位多减的步骤)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    string s;
    cin>>s;
    ll a=s[0]-'0';
    ll b=10-s[0]+'0'+1;
    for(int i=1;i<s.length();i++){
        ll ta=a,tb=b;
        a=min(ta,tb)+s[i]-'0';
        b=min(10-s[i]+'0'+1+ta,10-s[i]+'0'-1+tb);
    }
    cout<<min(a,b)<<endl;
    return 0;
}

M - Two Operations

#include<bits/stdc++.h>
using namespace std;
string s;
int arr[26];
int main(){
    ios::sync_with_stdio;
    cin>>s;
    memset(arr,26,0);
    for(int i=0;i<s.length();i++){
        arr[s[i]-'a']++;
    }
    for (int i = 0; i < 25; i++)
    {
        if(arr[i]==0) continue;
        arr[i + 1] +=arr[i]/2;
        if (arr[i] % 2 != 0) arr[i] = 1;
        else arr[i]=0;
    }
    for(int i=0;i<arr[25];i++){
        cout<<'z';
    }
    for(int i=24;i>=0;i--){
        if(arr[i]==0) continue;
        else cout<<char(i+'a');
    }
    cout<<endl;
    return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值