zoukankan      html  css  js  c++  java
  • Codefest19受虐记

    date: 2019-08-28

    前言

    比赛链接:Codefest 19

    A题

    思路:

    这是一道水题。你对着样例递推打一个表出来,会发现结果三个一组循环。

    例如:A = [3, 4, 7, 3, 4, 7, 3, 4, 7, ...]

    好了,我们只需要读入第0和第1项,把他们的异或值作为第2项,输出n对3取模的那一项就好。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int T,a[3],n;
    
    int main(){
    
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
    
        cin>>T;
        while(T--){
            cin>>a[0]>>a[1]>>n;
            a[2]=a[0]^a[1];
            cout<<a[n%3]<<endl;
        }
    
        return 0;
    }
    

    B题

    思路:

    这道题很容易暴力并且超时,首先用O(N^2)二重循环枚举去掉的区间,之后再O(NlogN)从头到尾跑一遍判重,复杂度是O(N^3logN)

    但是,我们先枚举从头开始的留下来的区间的长度(保证内部没有重复的),对于每一次枚举,右边的留下的长度都满足单调性,但是应该不可以二分(也可能我不会),相反,直接从右往左跑一遍判重就可以了。复杂度O(N^2logN)(log是因为使用了set来判重)。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int n;
    int a[2005];
    set<int> s;
    int ans,l,r;
    
    int main(){
    
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
    
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        ans=n;
        for(int i=0;i<=n;i++){
            if(s.find(a[i])!=s.end()){
                break;
            }
            s.insert(a[i]);
            set<int> t;
            for(int j=n;j>=1;j--){
                if(s.find(a[j])!=s.end()||t.find(a[j])!=t.end()){
                    ans=min(ans,j-i);
                    break;
                }
                t.insert(a[j]);
            }
        }
        cout<<ans<<endl;
    
        return 0;
    }
    

    C题

    思路:

    复制很多遍样例就可以AC(真的)。

    你把大的矩阵分割成很多4行4列的矩阵,之后你就可以把样例1的Output填上去。从左往右,从上往下第i个(从0开始数)矩阵的元素要加上16*i

    代码:

    此处我没有复制样例直接使用如下矩阵作为复制母版:

    0  1  2  3
    4  5  6  7
    8  9  10 11
    12 13 14 15
    

    其实他们的异或值也是相等的。

    #include<bits/stdc++.h>
    using namespace std;
    
    int n;
    int cur;
    int g[1005][1005];
    
    int main(){
    
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
    
        cin>>n;
        for(int i=0;i<n;i+=4){
            for(int j=0;j<n;j+=4){
                for(int k=0;k<4;k++){
                    for(int l=0;l<4;l++){
                        g[i+k][j+l]=cur++;
                    }
                }
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cout<<g[i][j]<<' ';
            }
            cout<<endl;
        }
    
        return 0;
    }
    

    结束

    从D开始我都不会做,所以就酱~

  • 相关阅读:
    背完这444句,你的口语绝对不成问题了
    过滤HTML
    Asp.net页面的生命周期
    查询分组中的前几条记录
    offsetLeft,Left,clientLeft的区别
    可以用javascript实现的10种图片特效
    了解黑客经常使用哪些工具
    js日历控件
    asp.net中的path备忘录
    ASP.NET MVC3 向View传递数据
  • 原文地址:https://www.cnblogs.com/BlahDuckling747/p/12019562.html
Copyright © 2011-2022 走看看