2023 CCPC Henan Provincial Collegiate Programming Contest

A.因为最多有26种情况(a最多26个情况)然后暴力判断b是不是回文串就行

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N = 2e5+10;
int n,m;
void solve(){
    string s;
    cin>>s;
    vector<int> c(27,0);
    int l=0;
    n=s.size();
    if(n==1){
        cout<<"NaN\n";
        return ;
    }
    for(int i=0;i<n;i++){
        int x=s[i]-'a';
        if(c[x]==0)
        {
            int l=i+1,r=n-1;
            bool f=true;
            while(l<r)
            {
                if(s[l]!=s[r])
                {
                    f=false;
                    break;
                }    
                else{
                    l++,r--;
                }
            }
            if(f){
                cout<<"HE\n";
                return ;
            }
        }
        else{
            break;
        }
        c[x]++;
    }
    cout<<"NaN\n";
}
int main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t;
    cin>>t;
    while(t--) solve();
}

B.首先固定一个k咋判断呢

要求升序=min(a[i:i+m-1])>max(a[1:i])

多个k呢,类似于筛法直接判断每个k即可

复杂度调和级数级别

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N = 1e6+10;
int n,m;
int a[N];
int mn[N],mx[N];
void solve(){
    cin>>n;
    memset(mn,0x3f,sizeof(mn));
    for(int i=1;i<=n;i++){
        cin>>a[i];
        mx[i]=max(mx[i-1],a[i]);
    }
    for(int i=n;i>=1;i--)
    {
        //mx[i]=max(mx[i+1],a[i]);
        mn[i]=min(mn[i+1],a[i]);
    }
    int cnt=0;
    for(int i=1;i<=n;i++){
        bool flag=true;
        for(int j=1;j<=n;j+=i)
        {
            if(mx[j-1]<=mn[j]){
                continue;
            }    
            else
            {
                flag=false;
                break;
            }
        }
        if(flag) cnt++;
    }
    cout<<cnt<<"\n";
    
}
signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
}

F.首先挑选m个数让每个数min(差值)*max(差值)

贪心:差值最小肯定是相邻的,所以排序就行,

转变成挑选m个连续的数计算贡献---滑动窗口

然后还要维护每个m个数相邻的差值最小值,我是直接用的multiset边插入边修改的

复杂度nlogn

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define int long long
const int N = 5e5+10;
int n,m;
int a[N];
void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    multiset<int> st;
    int res=0x3f3f3f3f;
    for(int i=2;i<=m;i++)
    {
        st.insert(a[i]-a[i-1]);
    }
    res=(a[m]-a[1])*(*st.begin());
    int r=m+1;
    int l=2;
    while(r<=n)
    {
        st.erase(st.lower_bound(a[l]-a[l-1]));
        st.insert(a[r]-a[r-1]);
        res=min(res,(a[r]-a[r-m+1])*(*st.begin()));
        l++;
        r++;
    }
    cout<<res<<"\n";
}
signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
}

E:常规dp

k要倒序枚举,类似于一维背包的体积

复杂度nmk

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N = 1e6+10;
int n,m,K;
char a[510][510];
void solve(){
    cin>>n>>m>>K;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            cin>>a[i][j];
    }
    vector<vector<int>> f(m+1,vector<int>(K+1,0));
    //memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            for(int k=K;k>=0;k--)
            {
                if(a[i][j]=='0'||a[i][j]=='1')
                {
                    f[j][k]=max(f[j-1][k]+(a[i][j]=='1'),f[j][k]+(a[i][j]=='1'));
                }    
                else
                {
                    f[j][k]=max({f[j][k],f[j][k],f[j-1][k]});
                    if(k)
                    f[j][k]=max({f[j][k],f[j][k-1]+1,f[j-1][k-1]+1});
                }
            }    
        }
    }
    cout<<f[m][K]<<"\n";
}
signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
    cin>>t;
    while(t--) solve();
}

G:模拟:

不想写了放弃

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N = 1e6+10;
typedef long long LL;
int n,m,K;
string sda[15][15];
string sxiao[15][15];
string deng[15],inf[N];
//跟顶端距离2 大 7*7
//跟顶端距离1 小 5*5
//跟底部左边距离都是1
int qmi(int a, int k)  // 求a^k mod p
{
    int res = 1;
    while (k)
    {
        if (k & 1) res = (LL)res * a ;
        a = (LL)a * a ;
        k >>= 1;
    }
    return res;
}

void solve(){
    LL x,y;
    scanf("%lld^{%lld}",&x,&y);
    
}
signed main()
{
    //cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    deng[0]="........";
    deng[1]="........";
    deng[2]="........";
    deng[3]="........";
    deng[4]=".=======";
    deng[5]="........";
    deng[6]=".=======";
    deng[7]="........";
    deng[8]="........";
    deng[9]="........";

    inf[0]="........................";
    inf[1]="........................";
    inf[2]=".IIIIIII.N.....N.FFFFFFF";
    inf[3]="....I....NN....N.F......";
    inf[4]="....I....N.N...N.F......";
    inf[5]="....I....N..N..N.FFFFFFF";
    inf[6]="....I....N...N.N.F......";
    inf[7]="....I....N....NN.F......";
    inf[8]=".IIIIIII.N.....N.F......";
    inf[9]="........................";

    sda[0][0]="........",sxiao[0][0]="......";
    sda[0][1]="........",sxiao[0][1]=".00000";
    sda[0][2]=".0000000",sxiao[0][2]=".0...0";
    sda[0][3]=".0.....0",sxiao[0][3]=".0...0";
    sda[0][4]=".0.....0",sxiao[0][4]=".0...0";
    sda[0][5]=".0.....0",sxiao[0][5]=".00000";
    sda[0][6]=".0.....0",sxiao[0][6]="......";
    sda[0][7]=".0.....0",sxiao[0][7]="......";
    sda[0][8]=".0000000",sxiao[0][8]="......";
    sda[0][9]="........",sxiao[0][9]="......";

    sda[1][0]="........",sxiao[1][0]="......";
    sda[1][1]="........",sxiao[1][1]=".....1";
    sda[1][2]=".......1",sxiao[1][2]=".....1";
    sda[1][3]=".......1",sxiao[1][3]=".....1";
    sda[1][4]=".......1",sxiao[1][4]=".....1";
    sda[1][5]=".......1",sxiao[1][5]=".....1";
    sda[1][6]=".......1",sxiao[1][6]="......";
    sda[1][7]=".......1",sxiao[1][7]="......";
    sda[1][8]=".......1",sxiao[1][8]="......";
    sda[1][9]="........",sxiao[1][9]="......";
    
    sda[2][0]="........",sxiao[2][0]="......";
    sda[2][1]="........",sxiao[2][1]=".22222";
    sda[2][2]=".2222222",sxiao[2][2]=".....2";
    sda[2][3]=".......2",sxiao[2][3]=".22222";
    sda[2][4]=".......2",sxiao[2][4]=".2....";
    sda[2][5]=".2222222",sxiao[2][5]=".22222";
    sda[2][6]=".2......",sxiao[2][6]="......";
    sda[2][7]=".2......",sxiao[2][7]="......";
    sda[2][8]=".2222222",sxiao[2][8]="......";
    sda[2][9]="........",sxiao[2][9]="......";
    
    sda[3][0]="........",sxiao[3][0]="......";
    sda[3][1]="........",sxiao[3][1]=".33333";
    sda[3][2]=".3333333",sxiao[3][2]=".....3";
    sda[3][3]=".......3",sxiao[3][3]=".33333";
    sda[3][4]=".......3",sxiao[3][4]=".....3";
    sda[3][5]=".3333333",sxiao[3][5]=".33333";
    sda[3][6]=".......3",sxiao[3][6]="......";
    sda[3][7]=".......3",sxiao[3][7]="......";
    sda[3][8]=".3333333",sxiao[3][8]="......";
    sda[3][9]="........",sxiao[3][9]="......";

    sda[4][0]="........",sxiao[4][0]="......";
    sda[4][1]="........",sxiao[4][1]=".4...4";
    sda[4][2]=".4.....4",sxiao[4][2]=".4...4";
    sda[4][3]=".4.....4",sxiao[4][3]=".44444";
    sda[4][4]=".4.....4",sxiao[4][4]=".....4";
    sda[4][5]=".4444444",sxiao[4][5]=".....4";
    sda[4][6]=".......4",sxiao[4][6]="......";
    sda[4][7]=".......4",sxiao[4][7]="......";
    sda[4][8]=".......4",sxiao[4][8]="......";
    sda[4][9]="........",sxiao[4][9]="......";
    
    sda[5][0]="........",sxiao[5][0]="......";
    sda[5][1]="........",sxiao[5][1]=".55555";
    sda[5][2]=".5555555",sxiao[5][2]=".5....";
    sda[5][3]=".5......",sxiao[5][3]=".55555";
    sda[5][4]=".5......",sxiao[5][4]=".....5";
    sda[5][5]=".5555555",sxiao[5][5]=".55555";
    sda[5][6]=".......5",sxiao[5][6]="......";
    sda[5][7]=".......5",sxiao[5][7]="......";
    sda[5][8]=".5555555",sxiao[5][8]="......";
    sda[5][9]="........",sxiao[5][9]="......";
    
    sda[6][0]="........",sxiao[6][0]="......";
    sda[6][1]="........",sxiao[6][1]=".66666";
    sda[6][2]=".6666666",sxiao[6][2]=".6....";
    sda[6][3]=".6......",sxiao[6][3]=".66666";
    sda[6][4]=".6......",sxiao[6][4]=".6...6";
    sda[6][5]=".6666666",sxiao[6][5]=".66666";
    sda[6][6]=".6.....6",sxiao[6][6]="......";
    sda[6][7]=".6.....6",sxiao[6][7]="......";
    sda[6][8]=".6666666",sxiao[6][8]="......";
    sda[6][9]="........",sxiao[6][9]="......";
    
    sda[7][0]="........",sxiao[7][0]="......";
    sda[7][1]="........",sxiao[7][1]=".77777";
    sda[7][2]=".7777777",sxiao[7][2]=".....7";
    sda[7][3]=".......7",sxiao[7][3]=".....7";
    sda[7][4]=".......7",sxiao[7][4]=".....7";
    sda[7][5]=".......7",sxiao[7][5]=".....7";
    sda[7][6]=".......7",sxiao[7][6]="......";
    sda[7][7]=".......7",sxiao[7][7]="......";
    sda[7][8]=".......7",sxiao[7][8]="......";
    sda[7][9]="........",sxiao[7][9]="......";


    sda[8][0]="........",sxiao[8][0]="......";
    sda[8][1]="........",sxiao[8][1]=".88888";
    sda[8][2]=".8888888",sxiao[8][2]=".8...8";
    sda[8][3]=".8.....8",sxiao[8][3]=".88888";
    sda[8][4]=".8.....8",sxiao[8][4]=".8...8";
    sda[8][5]=".8888888",sxiao[8][5]=".88888";
    sda[8][6]=".8.....8",sxiao[8][6]="......";
    sda[8][7]=".8.....8",sxiao[8][7]="......";
    sda[8][8]=".8888888",sxiao[8][8]="......";
    sda[8][9]="........",sxiao[8][9]="......";

    sda[9][0]="........",sxiao[9][0]="......";
    sda[9][1]="........",sxiao[9][1]=".99999";
    sda[9][2]=".9999999",sxiao[9][2]=".9...9";
    sda[9][3]=".9.....9",sxiao[9][3]=".99999";
    sda[9][4]=".9.....9",sxiao[9][4]=".....9";
    sda[9][5]=".9999999",sxiao[9][5]=".99999";
    sda[9][6]=".......9",sxiao[9][6]="......";
    sda[9][7]=".......9",sxiao[9][7]="......";
    sda[9][8]=".9999999",sxiao[9][8]="......";
    sda[9][9]="........",sxiao[9][9]="......";

    int t=1;
    cin>>t;
    while(t--) solve();
}

H.

题目....不解释 实数有小数点,去k个实数加起来=n且0<=每个实数<=n

手完可以发现

当k>2*n:让每2*n个数都是0.5,然后其他数都是0,这样肯定最多的总和,最小就是每个数都取0.49999,然后因为(k*0.5)向下取整肯定>=n,所以最小值是0,最大值是2*n

当k==2*n:让每2*n个数都是0.5,然后其他,数都是0,这样肯定最多的总和,最小就是每个数都取0.49999,但是因为k=n*2全部k-1个数去到0.4999,剩下一个数肯定要大于>0.5,所以最小值是0,最大值是2*n

其他情况:其实也是一样尽可能取0.5,剩下的数只能能取n-(k-1)*0.5,最大值是n+k/2(两个0.5的1所以(k)/2,是因为要剩下一个数注意一下剩下这个数也是可能取到xxx.5的所以同样算上),最小值相反取0.4999同理

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N = 1e6+10;
typedef long long LL;
int n,m,k;

int qmi(int a, int k)  // 求a^k mod p
{
    int res = 1;
    while (k)
    {
        if (k & 1) res = (LL)res * a ;
        a = (LL)a * a ;
        k >>= 1;
    }
    return res;
}

void solve(){
    LL x,y;
    cin>>n>>k;
    if(k>2*n)
    {
        cout<<"0 "<<2*n<<"\n";
    }
    else if(k==n*2)
    {
        cout<<"1 "<<2*n<<"\n";
    }
    else{
        cout<<n-(k-1)/2<<" "<<n+k/2<<"\n";
    }
    
    
}
signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
    cin>>t;
    while(t--) solve();
}

C;我想法就是直接暴力枚举length 然后判断后面有没有重复的字串

import random
import sys
import os
import math
from collections import Counter, defaultdict, deque
from functools import lru_cache, reduce
from itertools import accumulate, combinations, permutations
from heapq import nsmallest, nlargest, heapify, heappop, heappush
from io import BytesIO, IOBase
from copy import deepcopy
import threading
import bisect

# from sortedcontainers import SortedList
BUFSIZE = 4096


class FastIO(IOBase):
    newlines = 0

    def __init__(self, file):
        self._fd = file.fileno()
        self.buffer = BytesIO()
        self.writable = "x" in file.mode or "r" not in file.mode
        self.write = self.buffer.write if self.writable else None

    def read(self):
        while True:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            if not b:
                break
            ptr = self.buffer.tell()
            self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
        self.newlines = 0
        return self.buffer.read()

    def readline(self):
        while self.newlines == 0:
            b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
            self.newlines = b.count(b"\n") + (not b)
            ptr = self.buffer.tell()
            self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
        self.newlines -= 1
        return self.buffer.readline()

    def flush(self):
        if self.writable:
            os.write(self._fd, self.buffer.getvalue())
            self.buffer.truncate(0), self.buffer.seek(0)


class IOWrapper(IOBase):
    def __init__(self, file):
        self.buffer = FastIO(file)
        self.flush = self.buffer.flush
        self.writable = self.buffer.writable
        self.write = lambda s: self.buffer.write(s.encode("ascii"))
        self.read = lambda: self.buffer.read().decode("ascii")
        self.readline = lambda: self.buffer.readline().decode("ascii")


sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = lambda: sys.stdin.readline().rstrip("\r\n")


def I():
    return input()


def II():
    return int(input())


def MI():
    return map(int, input().split())


def LI():
    return list(input().split())


def LII():
    return list(map(int, input().split()))


def GMI():
    return map(lambda x: int(x) - 1, input().split())


def LGMI():
    return list(map(lambda x: int(x) - 1, input().split()))




def solve():
    s=I()
    for i in range(1000,10000+1):
        if len(s)%i!=0:continue
        if t in s[i:]:
            print("NO")
            return
    print("YES")
#2 0-59

# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    for _ in range(1):
        solve()
# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助

K:

首先打表1-10得结果

 好吧其实没啥明显规律

然后让排列得数最多,肯定优先相邻差值为2

剩下的数直接暴力查找插入哪些值即可

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N = 1e6+10;
typedef long long LL;
int n,m,k;
int a[N];
bool st[N];
bool check(int n){
    if(n<=3) return n>1;
    if(n%6!=1&&n%6!=5) return false;
    for(int i=5;i<=n/i;i+=6){
        if(n%i==0||n%(i+2)==0) return false;
    }
    return true;
}
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++) a[i]=i;
    if(n<=4){
        cout<<"-1\n";
        return ;
    }
    if(n<=10)
    {
        do
        {
            a[n+1]=a[1];
            bool f=true;
            for(int i=2;i<=n+1;i++){
                int x=abs(a[i]-a[i-1]);
                if(!check(x)){
                    f=false;
                    break;
                }
            }
            if(f){
                for(int i=1;i<=n;i++){
                    cout<<a[i]<<" ";
                }
                cout<<"\n";
                return ; 
            }
        }while(next_permutation(a+1,a+1+n));    
    }
    vector<int> b;
    k=(n&1)?0:-1;
        for(int i=1;i<=n+k;i+=2)
        {
            st[i]=true;
            b.push_back(i);
        }
        for(int i=n-3+k;i>=4;i-=2){
            st[i]=true;
            b.push_back(i);
        }

    vector<int> res;
    for(int i=1;i<=n;i++){
        if(!st[i]) res.push_back(i);
    }
    while(res.size()){
        int x=res.back();
        res.pop_back();
        vector<int> c;
        bool f=true;
        for(int i=0;i<b.size()-1;i++)
        {
            c.push_back(b[i]);
            if(!f) continue;
            if(check(abs(b[i]-x))&&check(abs(b[i+1]-x))){
                f=false;
                c.push_back(x);
            }
        }
        c.push_back(b.back());
        b=c;
    }
    for(auto&x:b) cout<<x<<" ";
    
}
signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值