ZJCPC2018 第15届 浙江省赛The 15th Zhejiang Provincial Collegiate Programming Contest(MABLJK 6题)

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJCPC2018 第15届 浙江省赛The 15th Zhejiang Provincial Collegiate Programming Contest(MABLJK 6题)相关的知识,希望对你有一定的参考价值。


补题地址:https://zoj.pintia.cn/home/news
搜索15th
本文按照通过率补的题

M. Lucky 7

  • 题意:如果存在从给出的长为n的序列中选择一个数+b 可以被7整除,就YES,不然就NO。
  • 思路:扫一遍即可。
#include<bits/stdc++.h>
using namespace std;

int main()
    int T;  cin>>T;
    while(T--)
        int n, b;  cin>>n>>b;
        int ok = 0;
        for(int i = 1; i <= n; i++)
            int x;  cin>>x;
            if((x+b)%7==0)
                ok = 1;
            
        
        if(ok)cout<<"Yes\\n";
        else cout<<"No\\n";
    
    return 0;

A. Peak

  • 题意:给出一串数字,然后判断是不是先增后减
  • 思路:先输入两个数满足开始是上升趋势,再开一个变量表示当前是上升还是下降,ans维护上升下降改变过的次数,最后判断即可。
#include<bits/stdc++.h>
using namespace std;

int main()
    int T;  cin>>T;
    while(T--)
        int n;  cin>>n;
        int a, b;  cin>>a>>b;
        int up=0, ans = 0, ok = 0;
        if(a<b)ok = 1, up = 1;
        a = b;
        for(int i = 3; i <= n; i++)
            cin>>b;
            if(up && a>b)
                up = 0;
                ans++;
            
            if(!up && a<b)
                ok = 0;
            
            if(a==b)ok = 0;//WA
            a = b;
        
        if(ok && ans==1)cout<<"Yes\\n";
        else cout<<"No\\n";
    
    return 0;

B. King of Karaoke

  • 题意: 给出两个数组,给第一个数组每个数都加K,令两个数组相同的数字尽可能多,求最多有多少个数字可以相同。
  • 思路: 输入两个数组,map记录一下每种差值的数量,取个最多的即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];

int main()
    int T;  cin>>T;
    while(T--)
        int n;  cin>>n;
        for(int i = 1; i <= n; i++)cin>>a[i];
        map<int,int>ma;
        int ans = 1;
        for(int i = 1; i <= n; i++)
            int x;  cin>>x;
            ma[x-a[i]]++;
            ans = max(ans, ma[x-a[i]]);
        
        cout<<ans<<"\\n";
    
    return 0;


L. Doki Doki Literature Club

  • 题意:给出n个字符串,每个字符串有一个开心值,选出m个组成句子,让开心值最大,字典序最小。
  • 思路:直接按照开心值和字典序排序输出即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 110;
struct node string s; LL w; a[maxn];
bool cmp(node x, node y) return x.w!=y.w?x.w>y.w:x.s<y.s; 

int main()
    int T;  cin>>T;
    while(T--)
        int n, m;  cin>>n>>m;
        for(int i = 1; i <= n; i++)
            cin>>a[i].s>>a[i].w;
        
        sort(a+1,a+n+1,cmp);
        LL sum = 0;
        for(int i = 1; i <= m; i++)
            sum += a[i].w*(LL)(m-i+1);
        
        cout<<sum<<" ";
        for(int i = 1; i <= m; i++)
            cout<<a[i].s<<" \\n"[i==m];
    
    return 0;



J. CONTINUE…?

  • 题意:n个学生从1到n编号,第i个学生有i个宝石。给出01串,0代表女生,1代表男生。
    求把所有学生分成4组,满足G1G2为女生,G3G4为男生,G1+G3==G2+G4。
  • 思路:
    首先特判掉宝石总数是奇数一定不行,因为宝石最后要被平均分成两份。
    考虑分配策略,对于一段连续的宝石数量,我们可以两两分组, 比如 1 2 3 4 5 6 7的时候,从后面两两分组得到(6,7),(4,5),(2,3),(1)。
    对于一组(6,7)内,我们把大的7给G1,G3,小的6给G2,G4。下一组(4,5)的时候小的给G1,G3,大的给G2,G4。四个一循环即可。(具体分给哪个看性别,反正G1+G3==G2+G4)
    如果最后%4!=0的情况下,有剩余的,我们分配给G2,G4,因为开始从大往小循环的时候大的先分配的是G1,G3,最后不够也是G2,G4不够。
#include<bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
const int maxn = 1e5+10;

int res[maxn];

int main()
    IOS;
    int T;  cin>>T;
    while(T--)
        int n;  cin>>n;
        string s;  cin>>s;  s = "0"+s;
        int sum = (n+1)*n/2;
        if(sum%2==1) cout<<"-1\\n"; continue; 
        int ok = 1;
        for(int i = n; i >= 1; i-=2)
            if(ok)
                res[i] = (s[i]=='1'?3:1);
                res[i-1] = (s[i-1]=='1'?4:2);
            else
                res[i] = (s[i]=='1'?4:2);
                res[i-1] = (s[i-1]=='1'?3:1);
            
            ok = !ok;
        
        if(n%4!=0)
            if(s[1]=='1')res[1] = 4;
            else res[1] = 2;
        
        for(int i = 1; i <= n; i++)
            cout<<res[i];
        cout<<"\\n";
    
    return 0;



K. Mahjong Sorting

  • 题意:
    本题的麻将一共有3M+1块,分别是M块条子,M块竹,M块点,这3M块普通麻将上面都有一个数字代表它的大小,以及1块特殊的白龙。3M块普通麻将按照一般顺序排序从前往后依次为:条子,竹,点。
    现在,从3M块普通麻将中选出一个“幸运块”,然后再从全部3M+1块麻将中选出N块麻将进行排序。规定新的排序方式如下:
    如果这N块麻将中有“幸运块”,那么需要放在最左边;
    如果这N块麻将中有白龙,那么需要放在幸运块原来的位置。
    给出按新排序方式排序过后的N块麻将的顺序,求解“幸运块”可能的数量。保证至少有一种解。

  • 思路:
    白龙在第一个时,答案与第二个有关;
    白龙在最后一个时,答案与倒数第二个有关;
    白龙在中间时,与前后两个都有关;
    不存在白龙时,答案与N有关。
    N为1时,所有块都能为“幸运块”,直接输出3M;
    第一个和第二个均不为白龙,且第一个大于第二个,说明第一个是被移动过来的“幸运块”,直接输出1

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e7+10;
int num[maxn];
int main()
    int T;  cin>>T;
    while(T--)
        int n, m;  cin>>n>>m;
        int s = 0;
        for(int i = 1; i <= n; i++)
            char ch;  cin>>ch;
            int x; 
            if(ch!='W')cin>>x;
            if(ch=='C')num[i] = x;
            else if(ch=='B')num[i] = m+x;
            else if(ch=='D')num[i] = m*2+x;
            else num[i] = 0, s = i;
        
        int ans = 0;
        if(n == 1)ans = 3*m;
        else if(num[1] > num[2] && s!=1 && s!=2)ans = 1;
        else if(s==0)ans = 3*m-n+1;
        else if(s==1)ans = num[2]-1;
        else 
            if(s==2)ans=1;
            if(s==n)ans += 3*m - num[n-1];
            else ans += num[s+1]-num[s-1]-1;
        
        cout<<ans<<"\\n";
    
    return 0;



以上是关于ZJCPC2018 第15届 浙江省赛The 15th Zhejiang Provincial Collegiate Programming Contest(MABLJK 6题)的主要内容,如果未能解决你的问题,请参考以下文章

ZJCPC2022 第19届 浙江省赛The 19th Zhejiang Provincial Collegiate Programming Contest(CBALGMIF 8题)

ZJCPC2022 第19届 浙江省赛The 19th Zhejiang Provincial Collegiate Programming Contest(CBALGMIF 8题)

ZJCPC2020 第17届 浙江省赛The 17th Zhejiang Provincial Collegiate Programming Contest(ABCIK 5题)

ZJCPC2019 第16届 浙江省赛The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)

ZJCPC2019 第16届 浙江省赛The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)

ZJCPC2021 第18届 浙江省赛The 18th Zhejiang Provincial Collegiate Programming Contest(ACFGJLM 7题)