保研机试训练[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\n",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("\n");
    }
}

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\n",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\n",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\n",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:\n",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\n");
    }
    else printf("%d\n",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<<"\n";
    }
    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)+">\n";
    }else if(text[0]=='*'){
        text.insert(0,"<ul>\n");
        text.insert(text.size(),"</ul>\n");
        l1=text.find("*");
        while(l1!=string::npos){
            text.replace(l1,2,"<li>");
            int r1=text.find("\n",l1);
            text.insert(r1,"</li>");
            l1=text.find("*",r1);
        }
    }else{
        text="<p>"+text.substr(0,text.size()-1)+"</p>\n";
    }
    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+"\n";
        else if(line.size()==0&&text.size()>0) solve();
    }
    if(text.size()>0) solve();
    return 0;
}

 

posted @ 2018-09-02 17:36  Elpsywk  阅读(634)  评论(0编辑  收藏  举报