Codeforces Round #321 (div. 2)

来源:互联网 发布:电脑端扫描仪软件 编辑:程序博客网 时间:2024/05/22 13:50

A. Kefa and First Steps

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>using namespace std;int main(){int n,a,b=-1,ans=0,maxn=-10;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a);if(a>=b){b=a;ans++;}else{maxn=max(maxn,ans);ans=1;b=a;}}maxn=max(maxn,ans);printf("%d\n",maxn);return 0;}

【B. Kefa and Company】 

 用优先队列做,先按照m由小到大排序,用优先队列维护m的差值为d的一段

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>#include <vector>#include <queue>using namespace std;#define inf 100005#define ll __int64struct node{ll m,s;}e[inf];struct cmpy{bool operator ()(const node n1,const node n2) {return n1.m>n2.m;}};bool cmp(node a,node b) {return a.m<b.m;}int main(){int n,d;scanf("%d%d",&n,&d);priority_queue<node,vector<node>,cmpy>q;for(int i=0;i<n;i++){scanf("%I64d%I64d",&e[i].m,&e[i].s);}ll ans=0,maxn=-10;sort(e,e+n,cmp);q.push(e[0]);ans=e[0].s;for(int i=1;i<n;i++){if(e[i].m-q.top().m>=d) {maxn=max(ans,maxn);while(e[i].m-q.top().m>=d && !q.empty()){node p=q.top();q.pop();ans-=p.s;}}q.push(e[i]);ans+=e[i].s;}maxn=max(maxn,ans);printf("%I64d\n",maxn);return 0;}

【C. Kefa and Park】

搜索

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>#include <vector>using namespace std;#define inf 100005vector<int>vec[inf];int tree[inf],vis[inf];int n,k,ans;void dfs(int u,int t){if(vec[u].size()==1 && vis[vec[u][0]]==1) {ans++;return;}vis[u]=1;int ti;for(int i=0;i<vec[u].size();i++){int v=vec[u][i];if(vis[v]==1) continue;if(tree[v]==0) ti=0;else ti=t+1;if(ti>k) continue;dfs(v,ti);}}int main(){memset(tree,0,sizeof(tree));memset(vis,0,sizeof(vis));scanf("%d%d",&n,&k);for(int i=1;i<=n;i++) scanf("%d",&tree[i]);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);vec[u].push_back(v);vec[v].push_back(u);}ans=0;dfs(1,tree[1]);printf("%d\n",ans);return 0;} 

【D. Kefa and Dishes】

状压dp,一共18 道菜,用s(1<<i)表示一种状态

dp[ ss ][ j ] = max(dp[ ss ][ i ]+p[ j ]+vis[ i ][ j ])

i表示这道菜已经吃过了,j表示接下来吃这道菜

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>using namespace std;#define ll __int64int p[20],vis[20][20];ll dp[(1<<18)+5][20];int main(){int n,m,k;scanf("%d%d%d",&n,&m,&k);for(int i=0;i<n;i++){scanf("%d",&p[i]);}memset(vis,0,sizeof(vis));for(int i=0;i<k;i++){int a,b;ll c;scanf("%d%d%d",&a,&b,&c);a--,b--;vis[a][b]=c;}for(int i=0;i<n;i++){dp[1<<i][i]=p[i];}int oo=1<<n;ll ans=0; for(int s=0;s<=oo;s++){int tot=0;for(int i=0;i<n;i++){if((s&(1<<i))==0) continue;tot++;for(int j=0;j<n;j++){if((s&(1<<j))!=0) continue;int ss=s|(1<<j);dp[ss][j]=max(dp[ss][j],dp[s][i]+p[j]+vis[i][j]);}}if(tot==m){for(int i=0;i<n;i++){ans=max(ans,dp[s][i]);}}}printf("%I64d\n",ans);return 0;} 

【E. Kefa and Watch】


0 0
原创粉丝点击