ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AcWing 周赛14

2021-09-30 10:32:46  阅读:133  来源: 互联网

标签:周赛 14 int ne while range print input AcWing


AcWing 周赛14

区间选数

题意

给出两个区间,要求分别输出两个不同的数,且第一个数属于第一个区间,第二个数属于第二个区间

题解

判断区间端点大小输出

c++

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int T; cin >> T;
    while(T--)
    {
        int l1, r1, l2, r2; cin >> l1 >> r1 >> l2 >> r2;
        if(r2 > r1)cout << l1 << " " << r2 << endl;
        else cout<< r1 << " " << l2 << endl;
    }
    return 0;
}

python

T = int(input())

for _ in range(T):
    l1, r1, l2, r2 = map(int, input().split())
    if(r1 > r2):
        print(r1, l2)
    else:
        print(l1, r2)

食堂排队

题意

有 \(n\) 个人,每个人都有到达时间 \(l\) 和最大忍耐时间 \(r\),打饭时间为 \(1\) 分钟,如果到达最大忍耐时间还没有到达离开,询问每个人的那个时间打饭

题解

模拟

c++

#include<bits/stdc++.h>
#define PII pair<int, int>
using namespace std;

int main()
{
    int T; cin >> T;
    while(T--)
    {
        int n; cin >> n;
        vector<PII> v;
        int mx = 0;
        for(int i = 1; i <= n; i++)
        {
            int l, r; cin >> l >> r;
            v.push_back({l ,r}); mx = max(l + r, mx);
        }
        int p = 0;
        for(int i = 1; i <= mx; i++)
        {
            if(i < v[p].first) continue;
            if(i >= v[p].first &&  v[p].second < i) 
            {
                while(p < n && i >= v[p].first &&  v[p].second < i) 
                {
                    cout << 0 <<" "; p ++;
                }
            }
            if(i < v[p].first) continue;
            if(p < n && i >= v[p].first) cout << i << " ";
            p++;
            if(p >= n) break;
        }
        cout << endl;
    }
    return 0;
}

python

import collections
import heapq

T = int(input())
for _ in range(T):
    n = int(input())
    l = list()
    mx = 0
    for i in range(n):
        tmp = list(map(int, input().split()))
        mx = max(tmp[0] + tmp[1], mx)
        l.append(tmp)
    p = 0
    for i in range(1, mx + 1):
        if(i < l[p][0]):
            continue
        if i >= l[p][0] and i > l[p][1]:
            while p < n and i > l[p][0] and i > l[p][1]:
                print(0, end = ' ')
                p += 1
        if p >= n:
            break
        if i < l[p][0]:
            continue
        if i >= l[p][0]:
            print(i, end = ' ')
        p += 1
        if p >= n:
            break
    print()
            

寻找字符串

题意

给一个字符串, 要求找出一个子串,要求子串即使前缀也是后缀并且在中间出现过

题解

考察 KMP 中 next 数组的理解

ne[i] : 表示 [0...i] 中最长相同前后缀的长度,而次长串表示 i = ne[i]

至此,我们只要求出 next 数组,并标记长度遍历即可

c++

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e6 + 10;
char s[maxn];
int ne[maxn];
int st[maxn];
int main()
{
    int T; cin >> T;
    while(T--)
    {
        cin >> (s + 1);
        int n = strlen(s + 1);
        for(int i = 2, j = 0; i <= n; i ++)
        {
            while(j && s[i] != s[j + 1]) j = ne[j];
            if(s[i] == s[j + 1]) j++;
            ne[i] = j;
        }
        for(int i = 1; i <= n; i++) st[i] = false;
        for(int i = 1; i < n ; i++) st[ne[i]] = true;
        int res = 0;
        for(int i = ne[n]; i != 0; i = ne[i])
        {
            if(st[i])
            {
                res = i; break;
            }
        }
        if(res == 0) cout << "not exist" << endl;
        else 
        {
            s[res + 1] = 0;
            cout << (s + 1) << endl;
        }
    }
    return 0;
}

python

T = int(input())
for _ in range(T):
    s = input()
    s  = '#' + s
    n = len(s)
    ne, st = [0] * (n + 1), [False] * (n + 1)
    j = 0
    for i in range(2, n , 1):
        while j and s[i] != s[j + 1]:
            j = ne[j]
        if s[i] == s[j + 1]:
            j += 1
        ne[i] = j
    for i in range(1, n - 1, 1):
        st[ne[i]] = True
    i = ne[n - 1]
    flag = 0
    while i:
        if st[i] == True:
            print(s[1:i + 1])
            flag = 1
            break
        i = ne[i]
    if flag == 0:
        print("not exist")
        

标签:周赛,14,int,ne,while,range,print,input,AcWing
来源: https://www.cnblogs.com/owoRuch/p/15355609.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有