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; }