2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 2)

来源:互联网 发布:centos升级kde 编辑:程序博客网 时间:2024/06/07 15:37

第一次与@morestep打比赛,(好激动)结果打到一半电脑死机了……
然后就开始了开心的颓废……
这里是morestep的csdn希望大家关注 http://blog.csdn.net/morestep

进入正题……

A.
题意:给一个字符串,求要添加多少个字母使得这个字符串出现一个子序列为“abcdefghijklmnopqrstuvwxyz”
题解:求一个最长上升子序列的长度,设其为x,然后答案就是26-x

E.
题意:输入n,k,然后n行,每行一个数t[i]表示做每道题目需要的时间,然后进行以下操作:
1.读前k题。
2.找出解决它用时最少的题目x。
3.做完x,并读下一道没读过的题目(如果有没读过的题目的话)。
4.如果仍然有没解决的题目,回到步骤2。
ans为每一道题目解决时的时间的和。读题不需要时间。
输出ans
题解: 模拟就好了。

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#include<queue>#define LiangJiaJun mainusing namespace std;int n,k;priority_queue<int,vector<int>,greater<int> >q;int a[304];long long t=0,ans=0;int LiangJiaJun(){    scanf("%d%d",&n,&k);    for(int i=1;i<=n;i++)scanf("%d",&a[i]);    for(int i=1;i<=k;i++)q.push(a[i]);    int tp=k+1;    while(!q.empty()){        t+=q.top();q.pop();        ans+=t;        if(tp<=n)q.push(a[tp++]);    }    printf("%I64d\n",ans);    return 0;}

F.
题意:给你一个长度为9的等式,问这个等式对不对….
题解:根本不需要好吧。

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#define LiangJiaJun mainusing namespace std;string s;int l,a[4],p=0;int LiangJiaJun(){    getline(cin,s);    l=s.length();    for(int i=0;i<l;i++){        if(isdigit(s[i])){            ++p;            while(isdigit(s[i])){                a[p]=a[p]*10+s[i]-'0';                i++;            }        }    }    if(a[1]+a[2]!=a[3])puts("NO");    else puts("YES");    return 0;}

G.
题意:给你一个图,o表示苹果,#表示障碍,重力方向向下,求问过段时间后图会是怎样。
题解:细节模拟题

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#define LiangJiaJun mainusing namespace std;char mp[504][504];int n,m;int LiangJiaJun(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)scanf("%s",mp[i]+1);    for(int i=1;i<=m;i++){        int lv=0;        for(int j=n;j>=1;j--){            if(mp[j][i]=='o'){               lv=j;               while(mp[lv+1][i]!='#'&&mp[lv+1][i]!='o'&&lv+1<=n){                    ++lv;               }               swap(mp[j][i],mp[lv][i]);            }        }    }    for(int i=1;i<=n;i++){        for(int j=1;j<=m;j++){            printf("%c",mp[i][j]);        }        puts("");    }    return 0;}

H.
题意: 给一张图,C表示被云遮住,W表示是水,L表示是陆地。请问图中陆地最少有多少块。(几个是陆地的点连在一起的,算一块陆地)
题解: bfs,把C都当做L来做,当然如果图中没有L的话直接输出0就OK。

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#include<queue>#define LiangJiaJun main#define x first#define y second#define pa pair<int,int>using namespace std;int dx[4]={1,0,-1,0},    dy[4]={0,1,0,-1};char mp[54][54];int n,m,cnt=0;queue<pa>q;vector<pa>ld;bool vis[54][54];int bfs(int a,int b){    q.push(make_pair(a,b));    vis[a][b]=1;    while(!q.empty()){        pa now=q.front();q.pop();        for(int i=0;i<4;i++){            if(now.x+dx[i]<=n&&now.x>0&&now.y+dy[i]<=m&&now.y+dy[i]>0){                if(mp[now.x+dx[i]][now.y+dy[i]]=='W'||                   vis[now.x+dx[i]][now.y+dy[i]])continue;                vis[now.x+dx[i]][now.y+dy[i]]=1;                q.push(make_pair(now.x+dx[i],now.y+dy[i]));            }        }    }    return 1;}int LiangJiaJun(){    memset(vis,0,sizeof(vis));    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)scanf("%s",mp[i]+1);    for(int i=1;i<=n;i++)        for(int j=1;j<=m;j++)            if(mp[i][j]=='L'){                ld.push_back(make_pair(i,j));            }    if(ld.size()==0)return puts("0"),0;    for(int i=0;i<ld.size();i++){        if(vis[ld[i].x][ld[i].y])continue;        ++cnt;        bfs(ld[i].x,ld[i].y);    }    printf("%d\n",cnt);    return 0;}

K.
题意: 给两个骰子的每个面都重新写上数字,第一个人扔第一个骰子,第二个人扔第二个,扔出点数大的人获胜,点数相同则重投。求问第一个人获胜的概率。
题解: s1=第一个骰子比第二个骰子的每一个数字大的方案数,s2=第二个骰子比第一个骰子大的方案数。答案就是s1/(s1+s2)。
注意:如果s1,s2都是0,那么答案是0。

M.
题意:求最长波动序列的长度(:-D)
题解: DP

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#define LiangJiaJun mainusing namespace std;int n;int f[54][2],a[54];int LiangJiaJun(){    scanf("%d",&n);    for(int i=1;i<=n;i++)scanf("%d",&a[i]);    for(int i=1;i<=n;i++)f[i][1]=f[i][0]=1;    for(int i=1;i<=n;i++){        for(int j=1;j<i;j++){            if(a[j]<a[i]){                f[i][1]=max(f[i][1],f[j][0]+1);            }            if(a[j]>a[i]){                f[i][0]=max(f[i][0],f[j][1]+1);            }        }    }    int ans=0;    for(int i=1;i<=n;i++)ans=max(ans,max(f[i][0],f[i][1]));    printf("%d\n",ans);    return 0;}
阅读全文
0 0