AtCoder Beginner Contest151参赛感悟
Posted njwsf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest151参赛感悟相关的知识,希望对你有一定的参考价值。
连打了三天的比赛,有点困。
这次比赛有点坑人,不过还是加分了。虽然比赛时我第五题没有对,但是我还是会讲六题的题解。
AB题太水了,就不多讲了。
C题也比较水,但是比赛时没发现如果一题不对就不算WA的次数(结果WA了),这里要注意一下。
好了,除了这个应该没其他的难处了,
代码:
#include #define ll long long #define F first #define S second #define P pair #define FOR(i,a,b) for(int i=a;i<=b;i++) #define V vector #define RE return #define ALL(a) a.begin(),a.end() #define MP make_pair #define PB push_back #define PF push_front #define FILL(a,b) memset(a,b,sizeof(a)) using namespace std; int f[100005],t[100005]; int main() { ios::sync_with_stdio(0); cin.tie(0); int ans=0; int n,m; cin>>n>>m; string s; int x,sum=0; FOR(i,1,m) { cin>>x>>s; if(f[x])continue; if(s=="AC") { ans+=t[x]; sum++; f[x]=1; } else { t[x]++; } } cout<<sum<<‘ ‘<<ans; return 0; }
D题这里只要纯暴力,直接枚举两点,跑最短路,就能求出答案(太水了。。。。。)。
直接上代码:
#include #define ll long long #define F first #define S second #define P pair #define FOR(i,a,b) for(int i=a;i<=b;i++) #define V vector #define RE return #define ALL(a) a.begin(),a.end() #define MP make_pair #define PB push_back #define PF push_front #define FILL(a,b) memset(a,b,sizeof(a)) using namespace std; int n,m; bool f[25][25],vis[25][25]; struct node { int h,l; int step; }; queue q; int fx[4][2]= { 0,1, 0,-1, 1,0, -1,0 }; int bfs(int x,int y,int zx,int zy) { while(!q.empty())q.pop(); node cur,t; cur.h=x; cur.l=y; cur.step=0; q.push(cur); memset(vis,0,sizeof(vis)); while(!q.empty()) { cur=q.front(); q.pop(); x=cur.h; y=cur.l; if(x<1||x>n||y<1||y>m)continue; if(f[x][y])continue; if(vis[x][y])continue; vis[x][y]=1; if(zx==x&&zy==y) { return cur.step; } FOR(i,0,3) { t.h=x+fx[i][0]; t.l=y+fx[i][1]; t.step=cur.step+1; q.push(t); } } return -2147483647; } int main() { ios::sync_with_stdio(0); cin.tie(0); char c; cin>>n>>m; for(int i=1; i<=n; i++) { FOR(j,1,m) { cin>>c; if(c==‘#‘)f[i][j]=1; } } int maxi=0; FOR(i,1,n) { FOR(j,1,m) { FOR(i1,1,n) { FOR(j1,1,m) { maxi=max(maxi,bfs(i,j,i1,j1)); } } } } cout<<maxi; return 0; }
E题有点坑,比赛时不会用C++求隔板法的方案数,结果就做不出来,弃题了。
但是赛后发现好水。。。
先把所有的数从小到大排序。枚举每一个数a[i],算有多少种方案使得它为最小,有多少方案使得它最大。再用总和减去最小方案数乘a[i],再加上最大方案数乘a[i],最后输出总和。
这里怎样算出方案数:
1.最大
那么就是必须选这个数,剩下的数从小于等于它到书中选。
2.最小
也是必须选这个数,剩下的数从大于等于它到书中选。
这里用排列组合求解。
附上代码:
#include #define int long long #define F first #define S second #define P pair #define FOR(i,a,b) for(int i=a;i<=b;i++) #define V vector #define RE return #define ALL(a) a.begin(),a.end() #define MP make_pair #define PB push_back #define PF push_front #define FILL(a,b) memset(a,b,sizeof(a)) using namespace std; int inv[100005],finv[100005],f[100005]; int n,a[100005],mod=1000000007; void C() { f[0]=1; finv[0]=1; finv[1]=1; f[1]=1; inv[1]=1; FOR(i,2,n) { f[i]=f[i-1]*i%mod; inv[i]=mod-inv[mod%i]*(mod/i)%mod; finv[i]=finv[i-1]*inv[i]%mod; } } int c(int n,int k) { if(n return f[n]*(finv[k]*finv[n-k]%mod)%mod; } signed main() { ios::sync_with_stdio(0); cin.tie(0); int k; cin>>n>>k; FOR(i,1,n)cin>>a[i]; sort(a+1,a+n+1); C(); int ans=0; FOR(i,1,n) { ans+=c(i-1,k-1)*a[i]%mod; ans=(ans+mod)%mod; ans-=c(n-i,k-1)*a[i]%mod; ans=(ans+mod)%mod; } cout<<ans; return 0; }
好了,终于写完了。
这次的水平又下降了一点,下次继续努力
以上是关于AtCoder Beginner Contest151参赛感悟的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Beginner Contest 154 题解