【2017年西南民族大学程序设计竞赛-网络同步赛】A C D E I J

当天有事情,没有参加,今天没事看了看题目,好像都不难,写几道过得人比较少的吧,好证明我写过 HAHA 。

A :星图
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述

现在有一个N*M的矩形星图。其中包括恒星和黑洞。恒星可以向上、下、左、右发射光束,且允许光束从其中穿过;黑洞会吸收所有经过的光束。
若一颗恒星向上、下、左、右发射光束,你能告诉我,该光束能否避免被黑洞吸收,进入星图之外的区域么?

输入描述:
单组输入。第一行三个正整数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”。(不包含引号)
示例1
输入

4 5 5
*##


##*

**

2 3 D
2 3 U
1 5 R
4 4 U
3 1 U
输出

YES
NO
YES
NO
YES
代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000+11;

char mp[MAXN][MAXN];
int sumx[MAXN][MAXN];
int sumy[MAXN][MAXN];
int main(){
    int n,m,q;scanf("%d%d%d",&n,&m,&q);
    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]=='*') {
                sumx[i][j]+=sumx[i][j-1]+1;
                sumy[i][j]+=sumy[i-1][j]+1;
            }
            else {
                 sumx[i][j]=sumx[i][j-1];
                 sumy[i][j]+=sumy[i-1][j];
            }
        }
    }
    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            printf("%d ",sumy[i][j]);
        }
        puts("");
    }*/
    while(q--){
        int a,b;char op[10]; scanf("%d%d%s",&a,&b,op);
        int sum=0;
        if(op[0]=='U') {
            sum=sumy[a][b];
            if(sum!=a)  puts("NO");else puts("YES");
        }else if(op[0]=='D'){
            sum=sumy[n][b]-sumy[a-1][b];
            if(sum!= n-a+1) puts("NO");else puts("YES");
        }else if(op[0]=='L') {
            sum=sumx[a][b];
            if(sum!=b) puts("NO");else puts("YES");
        }else {
            sum=sumx[a][m]-sumx[a][b-1];
            if(sum!= m-b+1) puts("NO");else puts("YES");
        }
    }
return 0;
}

C 装进肚子
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
自从ZZZZone吃完糖果后,他开始改吃巧克力了,他每天想吃n个巧克力增在甜蜜值,他决定早上吃K个巧克力,晚上吃n - K个巧克力,每个巧克力在早上吃和在晚上吃的甜蜜值是不一样的,他想让自己得到的甜蜜值最大,并想知道最大是多少。
请你编程帮助他。
输入描述:
第一行包含两个数n,K表示每天要吃的巧克力数量和要在早上吃的数量。(n <= 100000, K <= n)
第二行包含n个整数Ai(1 <= i <= n) 表示个第i个巧克力在早上吃可得到的甜蜜值 (Ai <= 100000)
第三行包含n个整数Bi(1 <= i <= n) 表示个第i个巧克力在晚上吃可得到的甜蜜值 (Bi <= 100000)
输出描述:
输出仅一行包含一个整数表示ZZZZone能获得的最大甜蜜值。
示例1
输入

2 1
3 6
2 8
输出

11
说明

早上吃第一个巧克力得到3甜蜜值,晚上吃第2个巧克力得到8的甜蜜值,所以最大可得到11的甜蜜值。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN =  100000 +11;

int a[MAXN];
bool cmp(int a,int b){ return a>b ; }
int main(){
    int n,k;  cin>>n>>k;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    LL ans=0;
    for(int i=0;i<n;i++){
        int b; scanf("%d",&b);
        ans+=b;
        a[i]=a[i]-b;
    }
    sort(a,a+n,cmp);
    for(int i=0;i<k;i++) ans+=a[i];
    cout<<ans<<endl;
return 0;
}

D
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
ZZZZone是一个特别喜欢甜食的人。有一天,他得到了n个糖果盒子,每个盒子里都有无穷个糖果,每个盒子里的糖果都有固定的甜蜜值。
为了获得更多的甜蜜值,ZZZZone列出了m个方案:每个方案中都有一个L 、R,ZZZZone会从第L个盒子到第R个盒子这连续的R - L + 1 个盒子中,每个盒子里拿出一颗糖吃掉,来获得甜蜜值。
每个方案最多只能实现一次,当然也可以不实现,那么,ZZZZone可以获得的最大甜蜜值是多少?

输入描述:
第一行,一个整数n,表示有n个糖果盒子 (n <= 10000)
第二行包含n个整数,表示从下标为1到n的盒子的甜蜜值(-10000 <= wi <= 10000)
第三行包含一个整数m表示方案数 (m <= 10000)
接下来m行,每行两个整数L, R (1 <= L, R <= n)
输出描述:
输出一行,包含一个整数表示最大的甜蜜值.
示例1
输入

5
1 -2 3 -4 5
2
1 5
1 2
输出

3
说明

第一个方案从1到5可得到3的甜蜜值,第二个可以得到-1的甜蜜值(此时当然不会选这个方案),所以最大可得到3的甜蜜值

#include<bits/stdc++.h>
using namespace std;
#define LL long long

const int MAXN = 10000+11 ;
const int MAXM = 1e6;
const int mod= 1e9+7;


LL sum[MAXN+11];
int main(){
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%lld",&sum[i]);
        sum[i]+=sum[i-1];
    }
    int m;scanf("%d",&m);
    LL ans=0;
    for(int i=1;i<=m;i++){
        int l,r;scanf("%d%d",&l,&r);
        if(l>r) swap(l,r);
        LL y=sum[r]-sum[l-1];
        if(y>0) ans+= y;
    }
    printf("%lld\n",ans);

return 0;
}

E
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
一天小明同学拿着m种颜色的油漆去涂刷n块格子,在涂刷的过程中他发现有很多种涂色方案,并很快的算出了答案,然后他发现如果涂好颜色的格子中只要存在某两个相邻的格子颜色一样,他就会感到开心,他想知道有多少种让他开心的涂刷方案。
输入描述:
输入仅包含一行,包含两个数n,m分别表示格子数和颜色数。(1 <= n <= 1e12, 1 <= m <= 1e12)
输出描述:
输出一行包含一个整数,让小明开心的涂刷方案数。 答案对1000000007取模
示例1
输入

3 2
输出

6
说明

一共有(1, 1, 2), (2, 1, 1), (2, 2, 1), (1, 2, 2), (1, 1, 1), (2, 2, 2) 这6种方案

#include<bits/stdc++.h>
using namespace std;
#define LL long long

const int MAXN = 10000+11 ;
const int MAXM = 1e6;
const int mod= 1e9+7;

LL qpow(LL a,LL b,LL c){
    LL s=1,base=a%c;
    while(b){
        if(b&1) s=s*base%c;
        base=base*base%c;
        b>>=1;
    }
    return s;
}
int main(){
    LL n,m;scanf("%lld%lld",&n,&m);
    if(m==1||n==1) {
        printf("0");
        return 0;
    }
    LL ans=qpow(m,n,mod);
    LL s=1; s*=m; s%=mod;
    s*=qpow(m-1,n-1,mod); s%=mod;
    printf("%lld\n",(ans-s+mod)%mod);
return 0;
}

I
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
XzzF最近过着吃土的日子,饿的神魂颠倒!突然看到有人在做美食节宣传,有好多好吃的,但想吃到这些好吃的可以不容易!得答对主办方出的题。
现在XzzF拿到这样一道题:长度为N的01字符串,且满足以下条件的方案数有多少种?
1、串中不能有两个或多个连续的0。
例如,10、10101、11101是满足条件的,而00、10001、10010是不满足条件的。
XzzF已经饿的神志不清了!显然没有力气回答这道题了,所以,你一定要帮XzzF吃上那些好吃的,不然就莫得了!

输入描述:
一个整数N(1 <= N <= 20)。
输出描述:
满足题目所述条件的方案数。
示例1
输入

1
输出

2
示例2
输入

2
输出

3
说明

有01、10、11三种满足条件的方案。
看到n==20就想用状压 ,A了之后又看一下发现其实就是斐波那契数列。mdzz
代码

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN =  100000 +11;

int main(){
    int n; cin>>n;
    int ans=0;
    for(int i=0;i<(1<<n);i++){
        int flag=1;
        for(int j=0;j<n-1;j++){
            if( !((i>>j)&1) && !((i>>(j+1))&1) ){
                flag=0;
                break;
            }
        }
        if(flag) ans++;
    }
    cout<<ans<<endl;
return 0;
}

J
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
猪妈妈让佩奇练习打字, 她给了佩奇一篇只有小写字母的字符串S ( 1 <= |S| <= 105)。 但是佩奇记不住键盘字母的位置,只能看着键盘一个一个打。淘气的乔治趁佩奇不注意, 偷偷的换了键盘按键的位置。 乔治是这样操作的:乔治每次扣下来两个键帽, 并且将这两个键帽互换位置重新安回去, 乔治越玩越起劲,一直重复了m(1 <= m <= 105)次。请输出佩奇打完字后屏幕上显示的实际字符串。
输入描述:
第一行输入一个字符串S ( 1 <= |S| <= 105);
第二行输入一个数字m(1 <= m <= 105), 表示佩奇要操作m次。
之后有m行, 每行有两个字母 c1, c2 表示佩奇要把这两个键帽互换位置。
输出描述:
输出一行字符串, 即佩奇用乔治玩坏的键盘输出的实际字符串。
示例1
输入

helloworld
3
e o
h z
l p
输出

zoppewerpd
备注:
|S| 是字符串s长度

#include<bits/stdc++.h>
using namespace std;
#define LL long long

const int MAXN =  1e6+11 ;
const int MAXM = 1e6;
const int mod= 1e9+7;

map<char,char>mp;
map<char,char>::iterator it,p1,p2;
char s[MAXN+11];
int main(){
    mp.clear();
    for(char i='a';i<='z';i++) mp[i]=i; 
    scanf("%s",s);
    int m; scanf("%d",&m);
    while(m--){
        char c1[10];  char c2[10]; 
        scanf("%s %s",c1,c2);
        for(it=mp.begin();it!=mp.end();it++){
            if(it->second==c1[0]) p1=it;
            if(it->second==c2[0]) p2=it;
        }
        mp[p1->first]=c2[0];
        mp[p2->first]=c1[0];
    }

    for(int i=0;s[i];i++){
        for(it=mp.begin();it!=mp.end();it++){
             if(it->second==s[i]){
                printf("%c",it->first);
                break;
             }
        }
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值