A题:水题。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long ll; const int maxn=1000100; ll n,a[maxn]; int main() { //freopen("in.txt","r",stdin); while(cin>>n){ REP(i,1,n) scanf("%I64d",&a[i]); int ans=1,now=1; REP(i,2,n){ if(a[i]>=a[i-1]) now++; else now=1; ans=max(ans,now); } printf("%d\n",ans); } return 0; }
B题:排序+贪心,水题。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long ll; const int maxn=1000100; int n,d; struct Node { ll m,s; friend bool operator<(Node A,Node B) { if(A.m<B.m) return 1; if(A.m==B.m) return A.s<B.s; return 0; } };Node a[maxn]; int main() { freopen("in.txt","r",stdin); while(cin>>n>>d){ REP(i,1,n){ scanf("%I64d%I64d",&a[i].m,&a[i].s); } ll ans=0,now=0; sort(a+1,a+n+1); int l=1,r=1; REP(r,1,n){ if(a[r].m-a[l].m<d) now+=a[r].s; else{ now+=a[r].s; while(a[r].m-a[l].m>=d) now-=a[l++].s; } //cout<<l<<" "<<r<<" "<<now<<endl; ans=max(ans,now); } cout<<ans<<endl; } return 0; }
C题:dfs,水题。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define PB push_back #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; int n,m; int has[maxn]; vector<int> G[maxn]; int u,v; int deg[maxn]; int dfs(int pre,int u,int cat) { if(has[u]) cat+=has[u]; else cat=0; if(cat>m) return 0; if(u!=1&°[u]==1) return 1; int res=0; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v==pre) continue; res+=dfs(u,v,cat); } return res; } int main() { //freopen("in.txt","r",stdin); while(cin>>n>>m){ REP(i,0,n) G[i].clear(); REP(i,1,n) scanf("%d",&has[i]); MS0(deg); REP(i,1,n-1){ scanf("%d%d",&u,&v); G[u].PB(v); G[v].PB(u); deg[u]++;deg[v]++; } printf("%d\n",dfs(0,1,0)); } return 0; }
D题:状压dp,TSP。
比赛的时候写的递推居然没过!!!!!!!!!赛后改成记忆化搜索直接1A了。。。。看来以后TSP就写记忆化搜索的形式比较保险一点。
#include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define PB push_back #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1100; const int INF=(1<<29); int n,m,k; ll c[maxn][maxn]; ll a[maxn]; ll x,y,z; ll dp[20][1<<20]; ll cnt[1<<20]; int Cnt(int x) { int res=0; for(int i=0;(1<<i)<=x;i++){ if(x&(1<<i)) res++; } return res; } void Init() { for(int i=0;i<(1<<20);i++){ cnt[i]=Cnt(i); } } ll dfs(int i,int s) { ll &res=dp[i][s]; if(~res) return res; if((s&(1<<i))==0) return res=-INF; if(cnt[s]==1) return res=a[i]; for(int j=0;j<n;j++){ if(i==j) continue; if(s&(1<<j)) res=max(res,dfs(j,s^(1<<i))+c[j][i]+a[i]); } return res; } int main() { freopen("in.txt","r",stdin); Init(); while(cin>>n>>m>>k){ REP(i,0,n-1) scanf("%I64d",&a[i]); MS0(c); while(k--){ scanf("%I64d%I64d%I64d",&x,&y,&z); x--;y--; c[x][y]=z; } memset(dp,-1,sizeof(dp)); ll ans=0; for(int i=0;i<n;i++){ for(int s=0;s<(1<<n);s++){ if(cnt[s]==m) ans=max(dfs(i,s),ans); } } printf("%I64d\n",ans); } return 0; }
虽然D题意外地没过,但还是涨分了,要是D题过了就直接涨到紫了,虽然没涨到紫,不过今天除了D题TSP没过时没能及时选择改成记忆化搜索的形式这点不好以外,其它的比赛策略手速基本没什么问题。感觉自己距离紫名越来越近了,不过还是要学更多的算法和数据结构,AC自动机,后缀自动机,splay,LCT,博弈论,数学,数论,计算几何,图论,各种dp,等等,还有很多很多要学。
对了,还有这场的E题,线段树,补补补!!!
原文:http://www.cnblogs.com/--560/p/4831103.html