zoukankan      html  css  js  c++  java
  • 保研机试训练[bailianoj]

    site:http://bailian.openjudge.cn/xly2018/

    1、计算任意两天之间的天数

    思路:以0为起始点计算天数,然后相减即可。这样的编码复杂度会减少很多。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    bool isleapyear(int y){
        return (y%4==0&&y%100!=0||y%400==0);
    }
    int sum1(int a1,int b1,int c1){
        int md[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        int res=a1*365;
        res+=(a1-1)/4+1;
        res-=(a1-1)/100+1;
        res+=(a1-1)/400+1;
        for(int i=1;i<b1;i++)res+=md[i];
        if(b1>2&&isleapyear(a1)) res++;
        res+=c1;
        return res;
    }
    int cnt(int a1,int b1,int c1,int a2,int b2,int c2){
        int res1=sum1(a1,b1,c1);
        int res2=sum1(a2,b2,c2);
        int ans=res2-res1;
        return ans;
    }
    int main(){
        int a1,b1,c1,a2,b2,c2;
        cin>>a1>>b1>>c1>>a2>>b2>>c2;
        printf("%d
    ",cnt(a1,b1,c1,a2,b2,c2));
        return 0;
    }

     2、回文子串

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main(){
        int n;
        cin>>n;
        while(n--){
            string s;
            cin>>s;
            int res=1;
            int residx=0;
            int length=0;
            for(int i=0;i<s.size();i++){
                int j=1;
                for(;;j++){
                    if(i-j<0||i+j>=s.size()) break;
                    if(s[i-j]!=s[i+j]) break;
                }
                j--;
                if(2*j+1>res){
                    res=2*j+1;
                    residx=i;
                    length=j;
                }
            }
            for(int i=residx-length;i<=residx+length;i++){
                printf("%c",s[i]);
            }
            printf("
    ");
        }
    }

    3、归并排序

    #include<bits/stdc++.h>
    #define maxn 50000
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    int L[maxn],R[maxn],a[maxn],n;
    void merge(int l,int mid,int r){
        int n1=mid-l,n2=r-mid;
        for(int i=0;i<n1;i++) L[i]=a[l+i];
        for(int i=0;i<n2;i++) R[i]=a[mid+i];
        L[n1]=R[n2]=inf;
        int i=0,j=0;
        for(int k=l;k<r;k++){
            if(L[i]<=R[j]) a[k]=L[i++];
            else a[k]=R[j++];
        }
    }
    void mergesort(int l,int r){
        if(l+1<r){
            int mid=(l+r)/2;
            mergesort(l,mid);
            mergesort(mid,r);
            merge(l,mid,r);
        }
    }
    int main(){
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i];
        mergesort(0,n);
        for(int i=0;i<n;i++){
            printf("%d ",a[i]);
        }
    }

     第二种归并排序的写法:

    #include<bits/stdc++.h>
    #define maxn 50000
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    int tmp[maxn],a[maxn],n;
    ll cnt=0;
    void merge(int l,int m,int r){
        int i=l,j=m+1,k=0;
        while(i<=m&&j<=r){
            if(a[i]<=a[j]) tmp[k++]=a[i++];
            else tmp[k++]=a[j++]; 
        }
        while(i<=m) tmp[k++]=a[i++];
        while(j<=r) tmp[k++]=a[j++];
        for(int i=l;i<=r;i++) a[i]=tmp[i-l];
    }
    void mergesort(int l,int r){
        if(l<r){
            int mid=(l+r)>>1;
            mergesort(l,mid);
            mergesort(mid+1,r);
            merge(l,mid,r);
        }
    }
    int main(){
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i];
        mergesort(0,n-1);
        for(int i=0;i<n;i++){
            printf("%d ",a[i]);
        }
        //printf("%d
    ",cnt);
    }

     求逆序对个数:

    #include<bits/stdc++.h>
    #define maxn 50000
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    int tmp[maxn],a[maxn],n;
    ll cnt=0;
    
    void merge(int l,int m,int r){
        int i=l,j=m+1,k=0;
        while(i<=m&&j<=r){
            if(a[i]<=a[j]) tmp[k++]=a[i++];
            else tmp[k++]=a[j++],cnt+=m-i+1; 
        }
        while(i<=m) tmp[k++]=a[i++];
        while(j<=r) tmp[k++]=a[j++];
        for(int i=l;i<=r;i++) a[i]=tmp[i-l];
    }
    
    void mergesort(int l,int r){
        if(l<r){
            int mid=(l+r)>>1;
            mergesort(l,mid);
            mergesort(mid+1,r);
            merge(l,mid,r);
        }
    }
    int main(){
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i];
        mergesort(0,n-1);
        /*for(int i=0;i<n;i++){
            printf("%d ",a[i]);
        }*/
        printf("%d
    ",cnt);
    }

     2012年thu机试第二题:贪心或dp

    #include<bits/stdc++.h>
    #define maxn 10006
    using namespace std;
    typedef long long ll;
    int a[maxn];
    int main(){
        int n,sum=0;
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i],sum+=a[i];
        int ave=sum/n;
        int store=0,ans=0,tmp;
        for(int i=0;i<n;i++){
            tmp=a[i]-ave;
            store+=tmp;
            ans+=abs(store);
        }
        printf("%d
    ",ans);
        return 0;
    } 

     thu2016第一题:

    #include<bits/stdc++.h>
    #define maxn 100006
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    int n,m,k,tmp[maxn];
    struct node{
        int num;
        int idx;
    }a[maxn];
    bool cmp(node &a,node &b){
        return (a.num<b.num)||(a.num==b.num&&a.idx<b.idx);
    }
    bool check(int x){
    //    printf("%d:
    ",x);
        int num=0;
        for(int i=1;i<=n;i++){
            if(a[i].idx<=x){
                tmp[num++]=a[i].num;
            }
        }
    
        if(num<m) return false;
        for(int i=0;m+i-1<num;i++){
            if(a[m+i-1].num-a[i].num<=k) return true;
        }
        return false;
    }
    
    int erfen(int l,int r){
        while(l<r){
            int mid=(l+r)>>1;
            if(check(mid)) r=mid;
            else l=mid+1;
        }
        return l;
    }
    int main(){
        cin>>n>>m>>k;
        for(int i=1;i<=n;i++) cin>>a[i].num,a[i].idx=i;
        sort(a+1,a+n+1,cmp);
        //for(int i=1;i<=n;i++) printf("%d ",a[i].num);
        int ans=erfen(1,n+1);
        if(ans==n+1){
            printf("impossible
    ");
        }
        else printf("%d
    ",ans);
        return 0;
    }
    /*
    6 3 5
    170 169 175 171 180 175
    */
    /*
    6 4 5
    170 169 175 171 180 175
    6 5 5 
    170 169 175 171 180 175
    */

     一定会有大模拟。。。

    url大模拟:

    #include<bits/stdc++.h>
    #define maxn 10006
    using namespace std;
    typedef long long ll;
    string s[maxn],t[maxn],tmps;
    bool match(string s,string t,bool flag){
        int lens=s.size(),lent=t.size();
        int ps=0,pt=0;
        while(ps<lens&&pt<lent){
            if(s[ps]==t[pt]){
                ps++,pt++;
            }else{
                if(t[pt++]!='<') return false;
                if(flag) cout<<" ";
                if(t[pt]=='i'){
                    bool ok=false;
                    while(s[ps]&&isdigit(s[ps])){
                        if(s[ps]!='0') ok=true;
                        if(flag&&ok) cout<<s[ps];
                        ps++;
                    }
                    if(!ok) return false;
                    pt+=4;
                }else if(t[pt]=='s'){
                    bool ok=false;
                    while(s[ps]&&s[ps]!='/'){
                        ok=true;
                        if(flag) cout<<s[ps];
                        ps++;
                    }
                    if(!ok) return false;
                    pt+=4;
                }else if(t[pt]=='p'){
                    if(flag){
                        while(s[ps]) cout<<s[ps],ps++;
                    }
                    return true;
                }
            }
        }
        return ps==lens&&pt==lent;
    }
    int main(){
        int n,m;
        cin>>n>>m;
        for(int i=0;i<n;i++) cin>>s[i]>>t[i];
        for(int i=0;i<m;i++){
            cin>>tmps;
            bool f1=false;
            for(int j=0;!f1&&j<n;j++){
                if(match(tmps,s[j],false)){
                    cout<<t[j]<<" ";
                    f1=true;
                    match(tmps,s[j],true);
                } 
            }
            if(!f1) cout<<"404";
            cout<<"
    ";
        }
        return 0;
    } 

     ccf-csp第三题:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    string text,line;
    void solve(){
        int l1=text.find("_");
        while(l1!=string::npos){
            text.replace(l1,1,"<em>");
            int r1=text.find("_",l1);
            text.replace(r1,1,"</em>");
            l1=text.find("_",r1);
        }
        
        l1=text.find("[");
        while(l1!=string::npos){
            int r1=text.find("]",l1);
            int l2=text.find("(",r1);
            int r2=text.find(")",l2);
            string tmp1=text.substr(l1+1,r1-l1-1);
            string tmp2=text.substr(l2+1,r2-l2-1);
            string tt="<a href=""+tmp2+"">"+tmp1+"</a>";
            text.replace(l1,r2-l1+1,tt);
            l1=text.find("[",r2);
        }
        
        //主要分为三部分 
        if(text[0]=='#'){
            int i=0;
            while(text[i]=='#') i++;
            text="<h"+string(1,'0'+i)+">"+text.substr(i+1,text.size()-i-3)+"</h"+string(1,'0'+i)+">
    ";
        }else if(text[0]=='*'){
            text.insert(0,"<ul>
    ");
            text.insert(text.size(),"</ul>
    ");
            l1=text.find("*");
            while(l1!=string::npos){
                text.replace(l1,2,"<li>");
                int r1=text.find("
    ",l1);
                text.insert(r1,"</li>");
                l1=text.find("*",r1);
            }
        }else{
            text="<p>"+text.substr(0,text.size()-1)+"</p>
    ";
        }
        cout<<text;
        text="";
    }
    int main(){
        freopen("C:\Users\Administrator\Desktop\demo2047.txt","r",stdin);
        text="";
        while(getline(cin,line)){
            if(line.size()>0) text+=line+"
    ";
            else if(line.size()==0&&text.size()>0) solve();
        }
        if(text.size()>0) solve();
        return 0;
    }
  • 相关阅读:
    hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)
    hihocoder 微软编程之美2015 初赛 第一场 (树算法 + 暴力思想 + 搜索思想)
    山东省第四届ACM程序设计竞赛A题:Rescue The Princess(数学+计算几何)
    poj 2336 Ferry Loading II ( 【贪心】 )
    HDU 2037 今年暑假不AC ( 起始与终止时间 【贪心】)
    hdu 2015校赛1002 Dual horsetail (思维题 )
    poj 3041 Asteroids(二分图 *【矩阵实现】【最小点覆盖==最大匹配数】)
    poj 3268 Silver Cow Party (最短路算法的变换使用 【有向图的最短路应用】 )
    【P1326】超级教主
    Tyvj 9.10 总结 (其实只是发一下心情)
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/9574539.html
Copyright © 2011-2022 走看看