没想到两场都是200分,虽然两场都只做两题。
初赛第一场: 题目:http://wenku.baidu.com/view/0dd551a8dd3383c4bb4cd2bb.html
A题:搜索一下,复杂度不算高
#include<iostream> #include<cstring> #include <cstdio> #include<string> #include<queue> #include<vector> #include<map> #include <set> #include<ctime> #include<cmath> #include <cstdlib> #include<algorithm> #include <iomanip> #include <bitset> using namespace std; #define LL long long const int N = 2000; struct node{ int xl,xr,h; }ar[N]; vector< pair<int,int> > v[N]; bool flag; int T,n,m,k; void dfs1(int k,int h){ if(flag==1) return ; for(int i=v[k].size()-1;i>=0;i--){ if(v[k][i].first<h) { if(v[k][i].second==0) dfs1(k+1,v[k][i].first); else dfs1(k-1,v[k][i].first); return ; } } if(k==1) flag=1; } void dfs2(int k,int h){ if(flag==1) return ; if(h!=0){ if(k-1>0) dfs1(k-1,h-1); if(k+1<=n) dfs1(k+1,h-1); }else{ if(k-1==1) flag=1; if(k+1==1) flag=1; } for(int i=v[k].size()-1;i>=0;i--){ if(v[k][i].first<h) { if(v[k][i].second==0) dfs2(k+1,v[k][i].first); else dfs2(k-1,v[k][i].first); return ; }else v[k].pop_back(); } if(k==1) flag=1; } int main(){ scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&m,&k); flag=0; for(int i=0;i<=n;i++) v[i].clear(); for(int i=0;i<m;i++){ scanf("%d%d%d",&ar[i].xl,&ar[i].xr,&ar[i].h); v[ar[i].xl].push_back( make_pair(ar[i].h,0) ); v[ar[i].xr].push_back( make_pair(ar[i].h,1) ); } for(int i=0;i<=n;i++) sort(v[i].begin(),v[i].end()); dfs2(k,1000000); if(flag==1) printf("Yes\n"); else printf("No\n"); } }
B题:水题不多说了
#include<iostream> #include<cstdio> #include<string> using namespace std; #define LL long long LL len(LL x){ if(x==0) return 1; LL ans=0; for(LL i=x;i!=0;i/=10) ans++; return ans; } LL ok(LL a,LL x){ LL lenx=len(x),ans=0; LL s=0,cnt=1; for(LL i=0;a!=0&&i!=lenx;a/=10,i++){ s+=(a%10)*cnt; cnt*=10; } if(s>=x) ans++; if(a>0) ans+=a; return ans; } int main(){ LL a,b,x,T; scanf("%lld",&T); while(T--){ scanf("%lld%lld%lld",&x,&a,&b); a--; printf("%lld\n",ok(b,x)-ok(a,x)); } }
初赛第二场: 题目:http://wenku.baidu.com/view/c2228c66ddccda38376baf0d.html
B题: 二分+并查集
#include<iostream> #include<cstring> #include <cstdio> #include<string> #include<queue> #include<vector> #include<map> #include <set> #include<ctime> #include<cmath> #include <cstdlib> #include<algorithm> using namespace std; #define eps 1e-8 const int N=1100; struct ufind{ int f[N]; void init(int x) { for(int i=0;i<=x;i++) f[i]=i;} int find(int x) { return f[x]==x?x:f[x]=find(f[x]);} void set_friend(int i,int j){ f[find(i)]=find(j);} bool is_friend(int i,int j){ return find(i)==find(j) ? 1:0; } }uf; struct node{ double x,y,z; }ar[N]; int n,m; double G[N][N]; bool vis[N]; double ok(int i,int j){ return (ar[i].x-ar[j].x)*(ar[i].x-ar[j].x)+ (ar[i].y-ar[j].y)*(ar[i].y-ar[j].y)+ (ar[i].z-ar[j].z)*(ar[i].z-ar[j].z); } bool solve(double mid){ uf.init(n); for(int i=0;i<n;i++) for(int j=0;j<i;j++){ if(G[i][j]<mid){ uf.set_friend(i,j); } } for(int i=0;i<n;i++){ vis[i]=false; } int cnt=0; for(int i=0;i<n;i++){ if(!vis[uf.find(i)]){ vis[uf.find(i)]=1; cnt++; } } if(cnt<m) return false; else return true; } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ for(int i=0;i<n;i++){ scanf("%lf%lf%lf",&ar[i].x,&ar[i].y,&ar[i].z); } for(int i=0;i<n;i++){ for(int j=0;j<i;j++){ G[i][j]=G[j][i]=ok(i,j); } } double left=0,right=1; while(left+eps<right){ double mid=(left+right)/2; if(solve(mid)) left=mid; else right=mid; } int temp = int(left * 1000000.0 + 0.5); left = double(temp) / 1000000; printf("%.6lf\n",left); } }
c题:dp
#include<iostream> #include<cstring> #include <cstdio> #include<string> #include<queue> #include<vector> #include<map> #include <set> #include<ctime> #include<cmath> #include <cstdlib> #include<algorithm> using namespace std; #define eps 1e-8 const int N=1100; pair<int,int> a[N]; struct node{ int k,x,y; }b[2]; int dp[N][N]; int ok(int i,int x){ return a[i].first*b[x].x+a[i].second*b[x].y; } int main(){ int n; while(scanf("%d",&n)!=EOF){ memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ scanf("%d%d",&a[i].first,&a[i].second); } for(int i=0;i<2;i++){ scanf("%d%d%d",&b[i].k,&b[i].x,&b[i].y); } for(int i=1;i<=n;i++){ for(int j=0;j<=i;j++){ if(j!=0) dp[i][j]=dp[i-1][j-1]+ok(i,0); dp[i][j]=max(dp[i-1][j]+ok(i,1),dp[i][j]); } } int ans=0; for(int i=0;i<=min(n,b[0].k);i++) ans=max(dp[n][i],ans); printf("%d\n",ans); } }