您的位置:首页 > 理论基础 > 计算机网络

2017年西南民族大学程序设计竞赛-网络同步赛

2017-12-31 22:48 453 查看
A星图

思路:利用前缀数组的特点,

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;
char map[1005][1005];
int mmp[1005][1005];
int mdp[1005][1005];
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='#')mmp[i][j]=mmp[i][j-1]+1;
else mmp[i][j]=mmp[i][j-1];
}

}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(map[j][i]=='#')mdp[j][i]=mdp[j-1][i]+1;
else mdp[j][i]=mdp[j-1][i];
}
}

/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<mdp[i][j]<<" ";
}
cout<<endl;
}*/

for(int j=1;j<=k;j++)
{

int q,w;
char a[5];
scanf("%d%d%s",&q,&w,a);
if(a[0]=='L')
{

if(mmp[q][w]==0)printf("YES\n");
else printf("NO\n");
}
else if(a[0]=='R')
{
int sum=mmp[q][m]-mmp[q][w-1];

if(sum==0)printf("YES\n");
else printf("NO\n");
}
else if(a[0]=='U')
{
//cout<<mdp[q][w]<<endl;

if(mdp[q][w]==0)printf("YES\n");
else printf("NO\n");
}
else
{
int sum=mdp
[w]-mdp[q-1][w];

if(sum==0)printf("YES\n");
else printf("NO\n");
}
}

return 0;
}


B 好数

暴力

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;

int main()
{
string n;
getline(cin,n);

int f=0;
for(int i=1;i<n.size();i++)
{
if(n[i]!=n[i-1])
{
f=1;
break;
}
}
if(f)printf("NO\n");
else printf("YES\n");

return 0;
}


C 装进肚子

贪心

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
int a[100005],b[100005],c[100005];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
long long sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
sum+=b[i];
c[i]=b[i]-a[i];
}
sort(c+1,c+n+1);
for(int i=1;i<=k;i++)
{
sum-=c[i];
}
cout<<sum<<endl;
}

}


D ZZZZone爱吃糖

数组的前缀和

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
long long sum[10005];
long long v[10005];
long long dp[10005];
int main()
{

int n;
while(~scanf("%d",&n))
{
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
int q;
scanf("%d",&q);
sum[i]=sum[i-1]+q;
}
//for(int i=1;i<=n;i++)cout<<sum[i]<<" ";cout<<endl;
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
int q,w;
scanf("%d%d",&q,&w);
v[i]=sum[w]-sum[q-1];
}
//for(int i=1;i<=m;i++)
//cout<<v[i]<<" ";
//cout<<endl;

for(int i=1;i<=m;i++)
{
if(v[i]>0)dp[i]=dp[i-1]+v[i];
else dp[i]=dp[i-1];
}
cout<<dp[m]<<endl;

}
return 0;
}


E 开心的涂刷

数学乘法原理  用快速幂

代码:

#include <iostream>
#define LL long long
using namespace std;
const int mod=1e9+7;
LL pow(LL a,LL b)
{
if(a==0)return 0;
a%=mod;
LL ans=1;
while(b>0)
{
if(b&1)ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
int main()
{
LL n,m;
cin>>n>>m;
LL ans=pow(m,n);
LL ma= (m%mod)*(pow(m-1,n-1))%mod;
cout<<(ans-ma+mod)%mod<<endl;
return 0;
}


F 兼职数靶

暴力

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
double map[13][13]={1,1,1,1,1,1,1,1,1,1,1,1,1,
1 ,2 ,2 ,2 ,2 ,2 ,2, 2, 2 ,2, 2 ,2, 1,
1 ,2, 2 ,2 ,2 ,2 ,2 ,2 ,2, 2, 2, 2, 1,
1 ,2, 2, 3 ,3 ,3 ,3 ,3 ,3, 3 ,2 ,2 ,1,
1 ,2, 2, 3 ,3 ,3 ,3 ,3 ,3 ,3 ,2 ,2 ,1,
1 ,2, 2, 3 ,3 ,4 ,4 ,4 ,3 ,3 ,2, 2 ,1,
1 ,2, 2 ,3 ,3 ,4 ,4 ,4 ,3 ,3 ,2, 2 ,1,
1 ,2, 2 ,3 ,3 ,4 ,4 ,4 ,3 ,3 ,2 ,2 ,1,
1 ,2, 2 ,3 ,3 ,3 ,3 ,3 ,3 ,3 ,2 ,2 ,1,
1 ,2, 2 ,3 ,3 ,3 ,3 ,3 ,3 ,3 ,2 ,2 ,1,
1 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,1,
1 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,1,
1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1, 1};

int main()
{

int n;
while(scanf("%d",&n)&&n)
{
char a;
double sum=0;
for(int i=0;i<13;i++)
{
for(int j=0;j<13;j++)
{
cin>>a;
if(a=='#'){sum+=map[i][j];}
}
}

double ans=sum/n;
printf("%.2lf\n",ans);

}

return 0;
}


G 卡牌游戏

暴力判断

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;

int main()
{
int n;
int q=0,w=0;
cin>>n;
string a,b;
string j="Jin",m="Mu",s="Shui",h="Huo",t="Tu";
for(int i=1;i<=n;i++)
{
cin>>a>>b;
if(a==j&&b==m)q+=3;
else
if(a==m&&b==t)q+=3;
else
if(a==t&&b==s)q+=3;
else
if(a==s&&b==h)q+=3;
else
if(a==h&&b==j)q+=3;
else
if(b==j&&a==m)w+=3;
else
if(b==m&&a==t)w+=3;
else
if(b==t&&a==s)w+=3;
else
if(b==s&&a==h)w+=3;
else
if(b==h&&a==j)w+=3;
else {q++;w++;}

}
if(q>w)cout<<"Alice"<<endl;
else if(q==w)
{
cout<<"Draw"<<endl;
}
else
{
cout<<"Bob"<<endl;
}

return 0;
}


H Hungry!

看故事

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;

int main()
{
int n;

while(~
4000
scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
printf("gu...");
}
printf("\n");
printf("The story is so boring. And I am so hungry!\n");
}

return 0;
}


I 快饿死的XzzF

dp一下,打表

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;

int dp[22][2];
void q()
{
dp[1][1]=1;
dp[1][0]=1;
for(int i=1;i<=20;i++)
{
for(int j=0;j<=1;j++)
{
if(j)
{
dp[i+1][0]+=dp[i][j];
dp[i+1][1]+=dp[i][j];
}
else
{
dp[i+1][1]+=dp[i][j];
}

}
}
}
int main()
{
int n;
q();
while(~scanf("%d",&n))
{
cout<<dp
[0]+dp
[1]<<endl;
}

return 0;
}


J 小猪佩奇练打字

题目怎么说就怎么做

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
int a[130];
int v[130][130];
int main()
{
char s[100005];

while(~scanf("%s",s))
{
memset(a,0,sizeof(a));

int n;
cin>>n;
for(int i=1;i<=122;i++)
{

a[i]=i;
}
for(int i=1;i<=n;i++)
{
char q,w;
cin>>q>>w;
int qq=q,ww=w;
int n=a[qq];
a[qq]=a[ww];
a[ww]=n;
}
char ss[100005];
int end=strlen(s);
for(int i=0;i<end;i++)
{
int e=s[i];
ss[i]=a[e];
}
for(int i=0;i<end;i++)
cout<<ss[i];
cout<<endl;

}

return 0;
}


K 免费WiFi

其实直接暴力,找最大就可以,我蛋疼用的树状数组区间更新。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

long long c[10005];

long long lowbit(long long x)
{
return x&(-x);
}
void add(long long x,long long v)
{
while(x<=10001)
{
c[x]+=v;
x=x+lowbit(x);
}
}

long long sum(int x)
{
long long su=0;
while(x>0)
{
su+=c[x];
x-=lowbit(x);
}
return su;
}

int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{   memset(c,0,sizeof(c));

int qq=0,ww=5500;
for(int i=1;i<=n;i++)
{
long long q,w;
scanf("%I64d%I64d",&q,&w);
add(q,1);
add(w+1,-1);
if(q>qq)qq=q;
if(q<ww)ww=q;
if(w>qq)qq=w;
if(w<ww)ww=w;
}
int ma=0;
for(int i=ww;i<=qq;i++)
{

long long su=sum(i);
if(su>ma)ma=su;

}
int mi=ma%m;
if(mi)cout<<ma/m+1<<endl;
else cout<<ma/m<<endl;

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  牛客练习 暴力 水题
相关文章推荐