[cf] The 2021 Sichuan Provincial Collegiate Programming Contest 赛前训练

前言 :

传送门 :

全程一直再写,但是基本都是模拟体验还好

因为规定半小时的训练赛,当开到 E E E题,刚刚开始算法的时候就没时间了,只有半小时了

A - Chuanpai

思路

范围很小,看了一下可以直接暴力 + 特判即可

CODE
#include <bits/stdc++.h>
using namespace std;
const int N = 7;
int a[N];
 
void solve()
{
    int k;
    cin>>k;
    if(k>12)
    {
        cout<<0<<endl;
        return;
    }
 
    int ans = 0 ;
    for(int i=1; i<=6; i++)
    {
        if(k - i <= 6 && k - i>0 && (k-i)<=i)
        {
            ++ans;
        }
    }
    cout<<ans<<endl;
}
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t -- )
        solve();
    return 0;
}

K - K-skip Permutation

思路

从当前点开始把能遍历到的点,全部打一个标记即可,为了不 T L E TLE TLE

我们 c o n t i n u e continue continue一下 以及 特判 1

CODE
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N = 7;
int a[N];
unordered_map<int,int> mp;
vector<int> v;
 
void solve()
{
    int n,k;cin>>n>>k;
    if(k == 1)
    {
        for(int i=1;i<=n;i++)
        {
            if(i == n)
            cout<<i;
            else
            cout<<i<<" ";
        }
        return;
    }
 
    for(int i = 1;i<=n;i++)
    {
        int j = i+k;
 
        if(mp[i])
            continue;
 
        while(j<=n)
        {
            if(!mp[j])
            {
                if(!mp[i])
                v.push_back(i);
 
                mp[i] = 1;
                v.push_back(j);
                mp[j] = 1;
            }
            j+=k;
        }
    }
 
    for(int i=1;i<=n;i++)
    {
        if(!mp[i])
         v.push_back(i);
    }
 
    int len = v.size();
    for(int i = 0 ;i<len;i++)
    {
        if(i == len - 1)
        cout<<v[i];
        else
        cout<<v[i]<<" ";
    }
 
}
int main()
{
    ios::sync_with_stdio(false);
   // int t;
 //   cin>>t;
   // while(t -- )
        solve();
    return 0;
}

D - Rock Paper Scissors

思路

贪心的匹配就行 从赢 到 平 最后才输

(这题写了很久 模拟还是写的太慢了!!)

CODE
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 7;
struct node
{
    int a,b,c;
} x,y;
 
void solve()
{
    cin>>x.a>>x.b>>x.c;
    cin>>y.a>>y.b>>y.c;
 
    int score = 0 ;
 
    if(y.a > 0 )
    {
        if(x.c > 0 )
        {
            int t = y.a;
            score += min(x.c , y.a);
 
            y.a -= x.c;
            x.c = (x.c - t > 0)?(x.c-t):0;
        }
    }
 
    if(y.a > 0)
    {
        if(x.a > 0)
        {
            int t = y.a;
            y.a -= x.a;
            x.a = (x.a - t > 0)?(x.a- t):0;
        }
    }
 
 
 
    if(y.a > 0)
    {
        if(x.b > 0)
        {
            int t = y.a;
            score -= y.a;
            x.b = (x.b - t>0)?(x.b - t) :0;
        }
    }
 
    if(y.b > 0 )
    {
        if(x.a  > 0 )
        {
             int t = y.b;
             score+=min(x.a,y.b);
             y.b -= x.a;
             x.a = (x.a - t > 0)?(x.a-t):0;
        }
    }
 
    if(y.b >0)
    {
        if(x.b > 0)
        {
            int t  =y.b;
            y.b -= x.b;
            x.b  = (x.b - t > 0)?(x.b - t):0;
        }
    }
 
    if(y.b > 0)
    {
        if(x.c > 0)
        {
            int  t = y.b;
            score -= y.b;
            x.c = (x.c - t >0)?(x.c - t):0;
        }
    }
 
 
    if(y.c > 0)
    {
        if(x.b >0)
        {
            int t = y.c;
            score+=min(y.c,x.b);
            y.c -= x.b;
            x.b = (x.b - t >0)?(x.b - t):0;
        }
    }
 
 
    if(y.c > 0)
    {
        if(x.c > 0)
        {
            int t = y.c;
            y.c -= x.c;
            x.c = (x.c - t >0)?(x.c - t):0;
        }
    }
 
    if(y.c>0)
    {
        if(x.a>0)
        {
            int t =y.c;
            score -= y.c;
            x.a = (x.a - t>0)?(x.a -t):0;
        }
    }
    cout<<score<<endl;
 
}
signed  main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t -- )
        solve();
    return 0;
}

H - Nihongo wa Muzukashii Desu

思路

懂日文的队友,看懂了题目

直接 查找 那几个 m a s u masu masu 然后 根据规则换即可

CODE
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N  = 10;
string s;
void get(int len )
{
    for(int i = 0 ; i<=len; i++)
        cout<<s[i];
}
void solve()
{
    cin>>s;
    int len = s.size();
 
    if(s == "ikimasu")
    {
        cout<<"itte"<<endl;
        return;
    }
  /**  if(int i = s.find("ikimasu") < len)
    {
        int pos  = len - (string("ikimasu").size());
        get(pos-1);
        cout<<"itte"<<endl;
        return;
    }**/
 
    if(int i = s.find("chimasu")<len)
    {
         int pos  = len - (string("chimasu").size());
        get(pos-1);
        cout<<"tte"<<endl;
        return;
    }
 
    if(int i = s.find("rimasu")<len)
    {
        int pos  = len - (string("rimasu").size());
        get(pos-1);
        cout<<"tte"<<endl;
        return;
    }
 
    if(int i = s.find("mimasu")<len)
    {
        int pos  = len - (string("mimasu").size());
        get(pos-1);
        cout<<"nde"<<endl;
        return;
    }
 
    if(int i = s.find("bimasu")<len)
    {
        int pos  = len - (string("bimasu").size());
        get(pos-1);
        cout<<"nde"<<endl;
        return;
    }
 
    if(int i = s.find("nimasu")<len)
    {
            int pos  = len - (string("nimasu").size());
        get(pos-1);
        cout<<"nde"<<endl;
        return;
    }
 
    if(int i = s.find("kimasu")<len)
    {
        int pos  = len - (string("kimasu").size());
        get(pos-1);
        cout<<"ite"<<endl;
        return;
    }
 
    if(int i = s.find("gimasu")<len)
    {
        int pos  = len - (string("gimasu").size());
        get(pos-1);
        cout<<"ide"<<endl;
        return;
    }
    if(int i = s.find("shimasu")<len)
    {
        int pos  = len - (string("shimasu").size());
        get(pos-1);
        cout<<"shite"<<endl;
        return;
    }
    if(int i = s.find("imasu")<len)
    {
        int pos  = len - (string("imasu").size());
        get(pos-1);
        cout<<"tte"<<endl;
        return;
    }
}
 
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t -- )
        solve();
    return 0;
}

B - Hotpot

思路

无脑计算了一下 时间复杂度 算出来是 1 e 8 1e8 1e8 感觉可以过 交上去T了
然后才发现看错题目

我们其实只需要 计算一下周期即可,会发现是两个周期重复的

CODE
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N  = 1e5+10;
int a[N];
 
unordered_map<int,int> mp;
void solve()
{
    mp.clear();
    int n,k,m;
    cin>>n>>k>>m;
    int h[n+1] = {0};
    int t[n+1] = {0};
 
    for(int i=1; i<=n; i++)
        cin>>a[i];
    int l = 1;
 
 
    int  t1 = 2*n;
    while(t1 -- )
    {
 
        if(!mp[a[l]])
        {
            mp[a[l]]++;
            l++;
            if(l>n)
                l=1;
            continue;
        }
 
        h[l]++;
        mp[a[l]] = 0 ;
 
        ++l;
        if(l > n)
            l = 1;
    }
 
    int cnt =  m/(2*n);
    for(int i=1;i<=n;i++)
    h[i]*=cnt;
 
    int t2 = m-cnt*2*n;
    while(t2 -- )
    {
 
        if(!mp[a[l]])
        {
            mp[a[l]]++;
            l++;
            if(l>n)
                l=1;
            continue;
        }
 
        h[l]++;
        mp[a[l]] = 0 ;
 
        ++l;
        if(l > n)
            l = 1;
    }
 
 
    for(int i=1; i<=n; i++)
    {
        if(i == n)
            cout<<h[i];
        else
            cout<<h[i]<<" ";
    }
    cout<<endl;
}
 
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t -- )
        solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值