2017年西南民族大学程序设计竞赛-网络同步赛
鉴于本人技术不足可能有些题目没有做得更好,希望各位多多包涵。
A-星图
单组输入。第一行三个正整数N,M,Q(1 <= N,M <= 1000,1 <= Q <= 1000000),分别表示矩阵的行列,以及询问的个数,询问之间相互独立。 然后一个N*M的矩阵,由’*’和’#’构成,表示星图。’*’表示恒星,’#’表示黑洞。 最后Q行,表示Q个询问,每行两个正整数x,y(1 <= x <= N, 1 <= y <= M)表示发光恒星的位置(从上往下数第x行,从左往右数第y列,且保证该位置一定是恒星)和一个字符p(p∈{‘L’, ‘R’, ‘D’, ‘U’},’R’表示向右;’L’表示向左;’D’表示向下’;’U’表示向上)表示该恒星产生光束的方向。
一共Q行。对于每个询问,若该恒星发出的光束能够进入星图之外的区域则输出“YES”;否则输出“NO”。(不包含引号)
4 5 5 **##* ***** *#*#* ##**# 2 3 D 2 3 U 1 5 R 4 4 U 3 1 U
YES NO YES NO YES
贴上代码:
一维处理
#include
#include
using namespace std;
const int maxz=1005;
int r[maxz];
int l[maxz];
int u[maxz];
int d[maxz];
int main()
{
int i,j;
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
for(i=0;i<1002;i++)
{
u[i]=maxz;
l[i]=maxz;
d[i]=0;
r[i]=0;
}
char ch1;
for(i=1;i<=n;i++)
{
getchar();
for(j=1;j<=m;j++)
{
scanf("%c",&ch1);
if(ch1=='#')
{
u[j]=min(i,u[j]); l[i]=min(j,l[i]);
d[j]=max(i,d[j]); r[i]=max(j,r[i]);
}
}
}
while(q--)
{
int x,y;
char ch;
scanf("%d %d %c",&x,&y,&ch);
int flag=0;
switch(ch)
{
case 'U':if(xd[y])flag=1;break;
case 'L':if(yr[x])flag=1;break;
}
if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
二维处理:
#include
const int maxn=1005;
int l[maxn][maxn];
int r[maxn][maxn];
int u[maxn][maxn];
int d[maxn][maxn];
char a[maxn][maxn];
int main()
{
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
for(int i=0;i=0;i--)
{
if(a[i][j]=='#')f=0;
if(f)d[i][j]=1;
}
}
for(int i=0,f=1;i=0;j--)
{
if(a[i][j]=='#')f=0;
if(f)r[i][j]=1;
}
}
while(q--)
{
int x,y;
char ch;
int flag=1;
scanf("%d %d %c",&x,&y,&ch);
x--;y--;
int i,j;
switch(ch)
{
case 'U':if(u[x][y]==0)flag=0;break;
case 'D':if(d[x][y]==0)flag=0;break;
case 'L':if(l[x][y]==0)flag=0;break;
case 'R':if(r[x][y]==0)flag=0;break;
}
if(flag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
B-好数
题目描述
我们定义“好数”:对于一个正整数,若它只有0~9中的一种数字构成,我们就称其为好数。现在给你一个正整数,请判断它是否为好数。
单组输入。一个正整数x(1<= x <= 10100000)
若该数x是“好数”则输出“YES”。否则输出“NO”。(没有双引号)
7777777777777777777777777777777777777888888888888888
NO
5555555555555555555555555555555555555555
YES
16146483543484318146436841468
NO
#include
#include
int main()
{
char str[100004];
scanf("%s",str);
char k=str[0];
for(int i=1;str[i]!='\0';i++)
{
if(str[i]!=k)
{
printf("NO\n");
return 0;
}
}
printf("YES\n");
return 0;
}
#include
#include
using namespace std;
typedef long long ll;
typedef struct point{
int x,y,c;
}p;
int cmp(p a,p b)
{
if(a.c==b.c)
return a.x>b.x;
return a.c>b.c;
}
int main()
{
int n,k,i,j;
p a[100005];
scanf("%d%d",&n,&k);
for(i=0;i
D- ZZZZone爱吃糖
#include
#include
using namespace std;
typedef struct p
{
int l,r;
}p;
int main()
{
int n,m,a[10001],i,j;
long long ans=0;
p b[10001];
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&b[i].l,&b[i].r);
}
for(i=1;i<=m;i++)
{
int cnt=0;
for(j=b[i].l;j<=b[i].r;j++)
{
cnt+=a[j];
}
ans=max(ans,ans+cnt);
}
printf("%lld\n",ans);
return 0;
}
#include
typedef long long ll;
const ll mod=1000000007;
ll qpow(ll n,ll m)
{
ll ans=1;
n%=mod;
while(m)
{
if(m&1)
ans=(n*ans)%mod;
n=(n*n)%mod;
m/=2;
}
return ans;
}
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
printf("%lld\n",(qpow(m,n)-(qpow(m-1,n-1)*(m%mod))+mod)%mod);
return 0;
}
#include
char str[14][14]={
{"1111111111111"},
{"1222222222221"},
{"1222222222221"},
{"1223333333221"},
{"1223333333221"},
{"1223344433221"},
{"1223344433221"},
{"1223344433221"},
{"1223333333221"},
{"1223333333221"},
{"1222222222221"},
{"1222222222221"},
{"1111111111111"},
};
int main()
{
char a[13][13];
int n;
while(~scanf("%d",&n),n)
{
getchar();
int ans=0;
for(int i=0;i<13;i++)
{
for(int j=0;j<13;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='#')
{
ans+=(str[i][j]-'0');
}
}
getchar();
}
printf("%.2lf\n",(ans*(1.0)/n*(1.0)));
}
return 0;
}
#include
int check(char *a,char *b)
{
if(a[0]=='J')
{
if(b[0]=='M')
return 1;
else if(b[0]=='H')
return -1;
else
return 0;
}
else if(a[0]=='M')
{
if(b[0]=='T')
return 1;
else if(b[0]=='J')
return -1;
else
return 0;
}
else if(a[0]=='S')
{
if(b[0]=='H')
return 1;
else if(b[0]=='T')
return -1;
else
return 0;
}
else if(a[0]=='H')
{
if(b[0]=='J')
return 1;
else if(b[0]=='S')
return -1;
else
return 0;
}
else if(a[0]=='T')
{
if(b[0]=='S')
return 1;
else if(b[0]=='M')
return -1;
else
return 0;
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);
getchar();
int ans1=0,ans2=0;
while(n--)
{
char a[10],b[10];
scanf("%s%s",a,b);
getchar();
if(check(a,b)==1)
{
ans1+=3;
}
else if(check(a,b)==-1)
{
ans2+=3;
}
else if(check(a,b)==0)
{
ans1++;ans2++;
}
}
if(ans1>ans2)
{
printf("Alice\n");
}
else if(ans1
#include
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i
#include
int main()
{
int a[21]={0,2,3};
for(int i=3;i<=20;i++)
{
a[i]=a[i-1]+a[i-2];
}
int n;
scanf("%d",&n);
printf("%d\n",a[n]);
return 0;
}
#include
#include
#include
#include
#include
using namespace std;
typedef struct p{
int si,fi;
}p;
int cmp(p x,p y)
{
if(x.si==y.si)
return x.fi=0;j--)
{
if(a[i].sians)
{
printf("%d\n",i);
break;
}
}
return 0;
}