西南民族大学第十届校赛(同步赛) 个人笔记 题解

版权声明:点个关注(^-^)V https://blog.csdn.net/weixin_41793113/article/details/89504482

题目链接:https://ac.nowcoder.com/acm/contest/322#question

先来一波官方题解

作者:兔子韩
链接:https://ac.nowcoder.com/discuss/151195?type=101&order=0&pos=1&page=0
来源:牛客网
 

T1 dreamstart的催促
用循环加快速幂即可解决,板子题~
复杂度:O(nlogn)

T2 TRDD got lost again 
使用 bfs 搜索即可,只不过每次点跳跃的坐标值是 2,障碍判断条件不同,时间负责度 O(nm)

T3 Company
题目中给的是一个有根树那么我们直接从1号点往下做DFS, 在回溯的时候转移一下就好了。
初始化: size[x] = a[x] <= K ? 1 : 0; 转移:size[x] += size[dr];

T4 >A->B->C-
按它的条件来找出 a 喜欢的 b,b 喜欢的 c,然后判断 c 喜欢的是不是 a 就可以了,时间复杂度 O(n)

T5 PPY的字符串
两个队列暴力模拟就完了。

T6 集训队脱单大法:这是一道只能由学姐我自己出数据的水题
正经做法:
前后各维护一个前缀最大值,然后枚举切的位置即可。
皮方法:
用全局最大值减去min(a[1], a[n])即可

T7 不想再WA了
图片说明

T8 Ricky’s RealDan’s Ricky
可以发现,除了只有一个娃娃机且是偶数的情况外,其他情况,RealDAN可以先把娃娃机中有偶数个的变为1,这样Ricky就永远拿不了这堆,然后对于有奇数个娃娃的娃娃机只要Ricky可以拿,那么RealDAN就可以拿。

T9 小A的期末作业
C语言题,不做解释。

T10 怪盗基德&月之瞳宝石
所可用的方法很多,不过都是通过找每个星体与其最近的前一个和后一个能源体而求得最小
值,最后得到总的最小的距离。

T11 正方体
题目其实很简单,在每一个样例中都会有三行输入,我们只要把第一行和第三行中非0的数字找出来并进行比较,把第二行第一个数和第三个数进行比较,把第二行第二个数和第四个数进行比较,当以上三组数都相同的时候说明满足条件,输出Yes!,否则输出NO!
需要特别注意的是:题目中要求每输出50行就要有一行空行,所以这个坑点大家一定要特别注意!

T12 简单的分数
辗转相除法 gcd 注意符号位置

T13 HJ浇花
图片说明

A.dreamstart的催促

链接:https://ac.nowcoder.com/acm/contest/322/A
来源:牛客网
 

题目描述

有一天集训队的学弟们正在计算一堆数,但是dreamstart感觉他们算的太慢了,就让他们坐在一起想出一个快速计算的方法,但是由于他们一时想不出来,想让你帮助他们。他们说现在有一个数列,要算出第 i 个数的 i 次幂并且把每个数计算出来的值加到一起,最后答案模10000019。

聪明的你可以帮助他们吗?

输入描述:

第一行有一个整数n,n <= 1e5

接下来一行有n个数,每个数的大小不超过1e16

输出描述:

输出取模之后的和

示例1

输入

复制

4
1 6 9 12

输出

复制

21502

快速幂裸题 

#include<iostream>
#include<cstdio>
using namespace std;

typedef long long ll;
const ll mod = 10000019;
const int MAX = 1e5+5;
int n;

ll mpow(ll a,ll n){
    ll ans = 1;
    while(n>0){
        if(n%2==1)
            ans = ans*a%mod;
        a = a*a%mod;
        n>>=1;
    }
    return ans;
}

int main(){
    ll sum=0,a=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a);
        sum = (sum+mpow(a,i))%mod;
    }
    printf("%lld\n",sum);

	return 0;
}

B.TRDD got lost again

链接:https://ac.nowcoder.com/acm/contest/322/B
来源:牛客网
 

题目描述

X城市是一个交通十分不便利的城市,城市可以看成一个n * m大小的矩阵, 现在TRDD手里有该城市的地图:一个2*n+1行, 2 *m+1列大小的地图。现在TRDD所在的格子用S表示,机场所在的格子用T表示。 其他格子用空格表示,地图上左右相邻的两个格子如果不能通行用"|"表示, 上下相邻的两个点如果不能通行用"-"表示,”+“表示格子的四个角。 题目保证城市X最外圈无法通行(具体请看样例输入)。

为了能尽快赶到机场,TRDD想请你帮忙计算出他到达机场最少需要走过多少个格子(包括起点S和终点T)。

如果无法到达机场T,则输出"TRDD Got lost...TAT"(不包括双引号)。

输入描述:

第一行读入两个数n, m(1 <= n, m <= 3000)表示X城市的大小。

之后有2 * n + 1行, 每行有2 * m + 1个字符, 用来表示TRDD手里的地图

题目保证S和T都有且仅有一个。

输出描述:

如果TRDD能到达机场, 则输出TRDD最少需要经过几个格子
否则输出"TRDD Got lost...TAT"(不包括双引号)

示例1

输入

复制

4 3
+-+-+-+
|S| | |
+ +-+-+
| | | |
+ +-+-+
| |T  |
+ +-+ +
|     |
+-+-+-+

输出

复制

8

说明

TRDD所在的位置为(1, 1), 机场的位置为(3, 2)
路线为(1, 1) -> (2, 1) -> (3, 1) -> (4, 1) -> (4,2) -> (4,3) -> (3,3) ->(3,2)
共8个格子

示例2

输入

复制

3 3
+-+-+-+
|S|   |
+ + +-+
| | |T|
+ + +-+
|   | |
+-+-+-+

输出

复制

TRDD Got lost...TAT

说明

无法从S到达T

备注:

由于数据量过大,建议不要使用scanf("%c")读入,否则可能会TLE。

如果输入样例显示格式有误, 请参考图片:

搜索,bfs,难点处理输入

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

const int MAX = 6005;
int n,m,x1,y1,x2,y2;
char ch[MAX][MAX];
bool vis[MAX][MAX];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};

struct Node{
    int x,y,t;
    bool operator < (const Node &e) const{
        return t > e.t;//小
    }
};

int bfs(){
    queue<Node> q;
    q.push({x1,y1,0});
    vis[x1][y1] = true;
    while(!q.empty()){
        Node u = q.front();
        q.pop();
        if(u.x==x2 && u.y==y2)
            return u.t;

        for(int i=0;i<4;i++){
            int x = u.x + dx[i];
            int y = u.y + dy[i];
            if(x>=0 && x<2*n+1 && y>=0 && y<2*m+1 && (ch[x][y]==' ' || ch[x][y]=='T') && !vis[x][y]){
                vis[x][y] = true;
                q.push({x,y,u.t+1});
            }
        }
    }
    return -1;
}

int main(){
    while(~scanf("%d%d",&n,&m)){
            getchar();
            for(int i=0;i<2*n+1;i++)
                gets(ch[i]);

            for(int i=0;i<2*n+1;i++)
                for(int j=1;j<2*m+1;j++)
                    if(ch[i][j]=='S')
                        x1=i,y1=j;
                    else if(ch[i][j]=='T')
                        x2=i,y2=j;
            int ans = bfs();
            if(ans==-1)
                printf("TRDD Got lost...TAT\n");
            else
                printf("%d\n",ans/2+1);
    }

	return 0;
}

 C.Company

链接:https://ac.nowcoder.com/acm/contest/322/C
来源:牛客网
 

题目描述

在一个偏僻的大山里, 一共有n个村庄, 编号1~n,每个村庄都有一定数量的村民, 其中只有1号村庄有水井,为了方便村民们日常用水,村民们一共修建了n-1根水管, 保证每一村庄都能有水喝。因为水是从高流向低, 所以我们知道1号村庄海拔最高, 与1号村庄直接相连的村庄高度次之, 以此类推。 

对于每一个村庄, 如果这个村庄的村民人数<=k, 我们称之为"劳动力不足的村庄"。

现在我们想知道, 如果水井不修在1号村庄, 而是修在任意一个村庄, 那么有水流过的村庄中有多少个村庄是"劳动力不足的村庄"(包括有水井的村庄本身)。

输入描述:

第一行输入两个数n(1 <= n <= 200000)村庄的数量, 以及劳动力的评估标准k(1 <= k <= 1e9)
第二行有n个数, 表示这n个村庄的村民数(1 <= a <= 1e9)
之后有n-1行, 每行两个数字u, v(1 <= u, v <= n) u, v两个村庄之间有一条水管。

输出描述:

输出n个数, 输出假设水井修在第i(1 <= i <= n)个村庄,那么有水流过的村庄中有多少个村庄是"劳动力不足的村庄"。

两个数之间用空格隔开

示例1

输入

复制

8 10
12 15 11 4 5 19 14 20
3 7
1 5
2 1
6 5
2 3
6 4
8 3

输出

复制

2 0 0 1 2 1 0 0

说明

 

蓝色数字表示村民数量, 红色数字为所求答案

示例2

输入

复制

5 10
13 15 19 5 3
2 3
4 1
1 2
3 5

输出

复制

2 1 1 1 1

说明

蓝色数字表示村民数量, 红色数字为所求答案

简单的树形dp,难点可能在建树上

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;

const int MAX = 200005;

int dp[MAX],a[MAX];
int n,m,k,x,y;

vector<int> g[MAX];


void dfs(int u,int pre){
    dp[u] = 0;
    if(a[u]<k)
        dp[u]++;
    for(int i=0;i<g[u].size();i++){
        int v = g[u][i];
        if(v==pre)
            continue;
        dfs(v,u);
        dp[u]+=dp[v];
    }
}


int main(){

    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(1,-1);
    for(int i=1;i<=n;i++)
        if(i!=n)
            printf("%d ",dp[i]);
        else
            printf("%d\n",dp[i]);

	return 0;
}

D.>A->B->C-

链接:https://ac.nowcoder.com/acm/contest/322/D
来源:牛客网
 

题目描述

 

一天小A在金色的银杏树下向他喜欢的小姐姐B表白了,“对不起,我喜欢的是C”,B这样说道,小A尴尬的笑了笑转身离开了。他心里默默说着“对不起,C喜欢我。”(233333333)

Love triangle被定义为:如果A喜欢B,B喜欢C,C喜欢A则称为Love triangle。现在让你寻找有没有Love triangle。

输入描述:

第一行一个正整数N(n<=5000),第二行n个数X1,X2,X3……Xn代表i喜欢Xi。

输出描述:

如果存在Love triangle则输出YES,没有则输出NO。

示例1

输入

复制

5
2 4 5 1 3

输出

复制

YES

被题目坑了,题目只要三角恋,我理解成环,4角5角的情况都加进去了唉

#include <bits/stdc++.h>
using namespace std;
const int N = 5*1e3+5;
int r[N];
 
int main()
{
    int n, x, flag = 0;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> x;
        r[i] = x;
    }
    for(int i = 1; i <= n; i++)
    {
        if(r[r[r[i]]] == i)
        {
            flag = 1;
            break;
        }
    }  
    if(flag)
        puts("YES");
    else
        puts("NO");
}

E.PPY的字符串

链接:https://ac.nowcoder.com/acm/contest/322/E
来源:牛客网
 

题目描述

Siry特别喜欢数学, 在他很小的时候他就对数字特别感兴趣, 他喜欢念数字。

具体念法是这样的: 给你一个数字, 依次念出每个数字有几个相邻(Siry会大声说出a个b, c个d...), 组合起来形成一个新的数字。

如:

2331的念法就是1个2,2个3,1个1, 形成的新数字就是122311。 再念一次就是1个1,2个2,1个3, 2个1, 形成的数字是11221321。

现在Siry大声的念出了第一次的数字x, Siry总共想要念n次, 你能快速的知道第n次的数字是多少吗?

输入描述:

每行输入两个数字x,n。 

1≤ x≤ 109,1≤ n≤ 30

输出描述:

输出一行,包括第n个数字的位数和这个数字。 位数和数字之间用空格隔开。

示例1

输入

复制

222 2

输出

复制

2 32

说明

第一次念出的数字是222, 第二次就会念3个2, 形成的数字就是32, 位数是两位数。

 暴力递归

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;

string f(string s,int n){
    if(n==1)
        return s;
    string ans="";
    int t=1;
    for(int i=0;i<s.size();i++){
        if(i+1<s.size() && s[i]==s[i+1])
            t++;
        else{
            ans+=('0'+t);
            ans+=s[i];
            t=1;
        }
    }
    //cout<<"!!"<<ans<<endl;
    return f(ans,n-1);
}



int main(){
    string s;
    int n;
    while(cin>>s>>n){
        s = f(s,n);
        cout<<s.size()<<" "<<s<<endl;
    }
	return 0;
}

F.集训队脱单大法:这是一道只能由学姐我自己出数据的水题

链接:https://ac.nowcoder.com/acm/contest/322/F
来源:牛客网
 

题目描述

        总所不周知!ZZZZone有了女朋友却谁也不知道。但是ZZZZone在集训队总是和陈大佬走的很近,每天搂搂抱抱十分不成体统!于是就被ZZZZone的女朋友给知道了,但是呢,ZZZZone的女朋友是一个热爱画画的温柔又可爱的女子,于是她决定把ZZZZone大卸两块,没错是两块!!

       ZZZZone呢他的长度为 n,并且每个单位长度都有一个相对应的重量,他的小女朋友希望将ZZZZone切成两部分后,两个部分中的最大重量之差的绝对值最大(显然两个部分均不能为空啊),她呢觉得很惆怅,不知道该怎么切最好,所以想让你们来想想办法。

输入描述:

第一行为一个n(2 <= n <= 105),表示ZZZZone的长度,第二行为n个数,表示ZZZZone每个单位长度的重量(0 <= a[i] <= 106)。

输出描述:

输出切成两部分后,每部分的重量的最大值之差的绝对值最大是多少。

示例1

输入

复制

4
3 4 1 6

输出

复制

3

备注:

对于样例:

4

3 4 1 6

那么一共有 3 种切法,分别是:

第一部分为 { 3 }, 第二部分为{ 4,1,6 },此时两部分的最大值之差的绝对值为 3

第一部分为 { 3,4 }, 第二部分为{ 1, 6 },此时两部分的最大值之差的绝对值为 2

第一部分为 { 3,4,1 }, 第二部分为{ 6 },此时两部分的最大值之差的绝对值为 2

所以答案为3.

前缀和,后缀和,找最大的绝对差,O(n) 

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int main(){
    int n;
    int a[200005];
    int left[200005];
    int right[200005];

    scanf("%d",&n);
    left[0]=0;
    right[n+1]=0;

    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        left[i] = max(left[i-1],a[i]);
    }

    for(int i=n;i>=1;i--)
        right[i] = max(right[i+1],a[i]);

    int ans=0;
    for(int i=1;i<n;i++)
        ans = max(ans,abs(left[i]-right[i+1]));
    printf("%d\n",ans);

	return 0;
}

 

G.不想再WA了

链接:https://ac.nowcoder.com/acm/contest/322/G
来源:牛客网
 

题目描述

欢迎参加西南民族大学 2018 年校赛。

对于你来说,做题 WA 了 是一件很痛苦的事,所以你从现在开始不想再看到有题 WA 了。

那么现在给你 A,C,W 三种字符,问组成一个长度为 n(不含 WA,即 W 后一个字符不能为 A ) 的字符串,总共有多少种方案?( T 组数据)

输入描述:

先输入一个 T,表示有 T 组数据。

然后输入需要组成字符串的长度 n_i  (1 <= i <= T)

1 <= T <= 10

1 <= n_i <= 10

输出描述:

对于每个 n_i 输出对应的答案

示例1

输入

复制

2
1
2

输出

复制

3
8

 数据规模小,直接递归了

#include<iostream>
#include<cstdio>
using namespace std;

int ans=0;

void dfs(string s,int n){
    if(n<=0){
        if(s.find("WA")==-1)
            ans++;
        return;
    }
    dfs(s+"A",n-1);
    dfs(s+"W",n-1);
    dfs(s+"C",n-1);
}

int main(){
    int T,n;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        ans=0;
        dfs("",n);
        printf("%d\n",ans);
    }

	return 0;
}

H.Ricky’s RealDan’s Ricky

链接:https://ac.nowcoder.com/acm/contest/322/H
来源:牛客网
 

题目描述

The 2019 is coming!Ricky 和 RealDan为了庆祝2018一年的成果,准备去大吃一顿,然而 Ricky 想吃火锅, RealDan 想吃海鲜。为了解决吃什么的难题, 他们向聪明的神秘人(出题人)寻求帮助,神秘人则给他们出了这样一个问题:

现在有 n 个娃娃机,第i(1 <= i <= n) 个娃娃机中有 a[i] 个娃娃。

规则如下:

Ricky 和 RealDan 轮流抓娃娃,

Ricky 每轮只能从其中一个娃娃机中抓走偶数个娃娃。

RealDan 每轮只能从其中一个娃娃机中抓走奇数个娃娃。

每人每轮至少抓走一个娃娃(他们都超级厉害),  Ricky 先开始抓。

他们在神秘人的教导下,都已经变得非常聪明。最后谁抓不了娃娃,谁就被视为 loser,并且还要把自己抓到的娃娃送给对方,loser也必须去Winner喜欢的地方吃饭。

现在他们找到你,想让你看一下他们究竟谁可以赢。

Note: All the best wishes give Ricky and RealDan by their old friend ~

输入描述:

第一行一个t,表示t组数据。

每组数据有两行:

第一行一个n(1 <= n <= 100000)代表n个娃娃机

下一行有n个数字,代表每一个娃娃机中的娃娃数量a[i] (1 <=  a[i] <= 1e9)

输出描述:

如果最后Ricky获胜,则输出“Ricky is Winner”(不包括双引号),反之则输出“RealDan is Winner”(不包括双引号)。

示例1

输入

复制

1
2
1 2

输出

复制

RealDan is Winner

I.小A的期末作业

链接:https://ac.nowcoder.com/acm/contest/322/I
来源:牛客网
 

题目描述

期末了, 老师给小A布置了一道期末作业, 让小A设计一个图案, 追求完美的小A想要用编程来完成这个图案:

小A想要设计一个由*符号组成的“大于号”图案, 图案的大小为n, 一共有2n-1行, 每行有n个*符号, 每一行前面有一些空格。

第一行没有空格, 第二行有一个空格, 第三行有两个空格。。。。 依次类推

图案是轴对称图形。

输入描述:

读入一个数字n(1 <= n <= 100), 表示图案的大小.

输出描述:

输出小A想要的图形

示例1

输入

复制

4

输出

复制

****
 ****
  ****
   ****
  ****
 ****
****

示例2

输入

复制

5

输出

复制

*****
 *****
  *****
   *****
    *****
   *****
  *****
 *****
*****

找规律,模拟

#include<iostream>
#include<cstdio>
using namespace std;

int main(){
    int n,T;
    int a[100005];
    scanf("%d",&T);
    while(T--){
        int sum=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);

        if(n==1 && a[1]%2==0)
            printf("Ricky is Winner\n");
        else
            printf("RealDan is Winner\n");
    }

	return 0;
}

J.怪盗基德 & 月之瞳宝石

 链接:https://ac.nowcoder.com/acm/contest/322/J
来源:牛客网
 

题目描述

在这片寂静的夜色之下,他就这样静静的降临在我的面前,他的眼神就好像能看透了一切,露出了无所畏惧的笑容。一袭白斗篷和一顶白礼帽,不带一丝多余的动作,他的脸在单眼眼睛跟逆光之下。 

                                                                             to 世纪末的魔术师

                                                                                              By the mysterious man

怪盗基德在上次失败后,对美丽的月之瞳宝石非常觊觎,他想要得到它,以世纪末的魔术师的名义。但是却遇到了重重机关阻拦,眼看到了月之瞳宝石盒之前,怪盗基德却停下了脚步。

“世界上有些谜,还是让它永远成为谜比较好”

话音刚落,只见一片白雾,待雾散开之时,他已经消失在月色之中。

在怪盗基德走后,你潜入进去,却发现,上面篆刻着一段奇怪的话:

  在缥缈的宇宙中,有一条穿越时空的隧道,在这条隧道中,有着许多星体和能源体,他们都排列在一条直线上,对于每个星体而言,他们都需要能源体的照耀才能够存活于这条时空隧道当中,当然一个能源体可以同时为多个星体提供能源(对于一个能源体来说,也可能没有星体需要它提供能源)。但是,有所限制的是每个能源体只能为与自身相距x之内的星体提供能源。现在需要你找到最小的x,使得每个星体都能够得到能源(即每个星体必须得到至少一个能源体的照耀)。    

现在是你作为怪盗基德的徒弟大展身手的时候了。

输入描述:

输入共三行,第一行有两个数n和m(1 <= n, m <= 1e5),分别代表有n个星体,m个能源体。

第二行有n个数a1, a2, ... an,代表n个星体的位置。(-2e9 <= a[i] <= 2e9)

第三行有m个数b1, b2, ... bm,代表m个能源体的位置。(-2e9 <= b[j] <= 2e9)

输出描述:

输出最小的x,满足每个星体都有至少一个能源体为其提供能源。

示例1

输入

复制

3 2
-2 2 4
-3 0

输出

复制

4

说明

对于3个位置的星体,与其距离最近的能源体距离分别为1,2,4,所以能源体照耀的范围只需为4即可

示例2

输入

复制

4 3
7 -2 5 6
1 8 -3

输出

复制

3

二分,找到第一个大于等于它的数,和它的左右边比较

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
 
const int MAX = 1e5+5;
typedef long long ll;
int n,m;
ll a[MAX],b[MAX];
 
 
int findpos(int x){
    int l=1,r=m,ans=1;
    while(l<=r){
        int mid = l + (r-l)/2;
        if(b[mid]<=x)
            l=mid+1,ans=mid;
        else
            r = mid-1;
    }
    return ans;
}
 
 
int main(){
 
 
    while(~scanf("%d%d",&n,&m)){
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]);
        for(int i=1;i<=m;i++)
            scanf("%lld",&b[i]);
        sort(a+1,a+n+1);
        sort(b+1,b+m+1);
        ll ans=0;
        b[m+1]=b[m];
        for(int i=1;i<=n;i++){
            int j=findpos(a[i]);
            ans = max(ans,min(abs(a[i]-b[j]),abs(a[i]-b[j+1])));
        }
 
        printf("%lld\n",ans);
    }
 
    return 0;
}

K.正方体

链接:https://ac.nowcoder.com/acm/contest/322/K
来源:牛客网
 

题目描述

已知一个正方体,每个面上都有任意一个数(假设每一面的面积足够大来装下当前面上的数字),现被展开成了如下形式:

输入中保证第一行有一个面,第二行有四个面,第三行有一个面。请用代码检查这个正方体对立面上的数是否相同。

输入描述:

输入包含多个测试样例。第一行为一个整数T(1 <= T <= 1e4),接下来每个样例占3行,每行都包括4个数,为0表明当前位置不表示面,每个面上的数值范围不超过int。

Eg:上图的输入为:

0 1 0 0

2 4 2 4

0 0 1 0

输出描述:

对于每个测试样例,如果当前正方体的三个对立面的数都分别相同的话就输出”Yes!”,否则输出”No!”。每个结果占一行,注意每50个结果要加一个空行。

示例1

输入

复制

3
0 2 0 0
1 3 1 3
0 2 0 0
0 2 0 0
1 3 1 3
0 0 0 2
0 0 0 2
1 2 2 1
0 0 1 0

输出

复制

Yes!
Yes!
No!

 找规律可以发现,第二行必须有4个值,而且要隔位相等,然后剩下的2个相同的数要分布在第1行和第2行

#include<iostream>
#include<cstdio>
using namespace std;

int a[3][4];

bool ok(int t){
    if(t!=6)
        return false;

    for(int i=0;i<4;i++)
        if(a[1][i]==0)
        return false;

    if((a[1][0]==a[1][2]&&a[1][1]==a[1][3])){
        int x=0,y=0;
        for(int i=0;i<4;i++){
            x = max(x,a[0][i]);
            y = max(y,a[2][i]);
        }
        if(x==y)
            return true;
    }

    return false;
}

int main(){

    int T,t,cnt=1;
    scanf("%d",&T);
    while(T--){
        t=0;
        for(int i=0;i<3;i++)
            for(int j=0;j<4;j++){
                scanf("%d",&a[i][j]);
                if(a[i][j]>0)
                    t++;
            }
        if(ok(t))
            printf("Yes!\n");
        else
            printf("No!\n");
        if((cnt++)%50==0)
            printf("\n");
    }



	return 0;
}

L.简单的分数

链接:https://ac.nowcoder.com/acm/contest/322/L
来源:牛客网
 

题目描述

John最近对分数很感兴趣,在研究分数的加减运算。现在要求计算两个分数的运算。

输入描述:

输入一个正整数T,表示有T组数据

每组数据包括5个整数op,a,b,c,d

op为1表示a/b + c/d;op为0表示为a/b – c/d

其中1 <= T, a,b,c,d <= 100;

输出描述:

输出分数运算结果“x/y”,要求x/y是最简分数。

示例1

输入

复制

4
1 1 2 1 3
0 1 2 1 2
1 1 2 1 2
0 1 3 1 2

输出

复制

5/6
0/1
1/1
-1/6

备注:

如果有运算符,应在x前面,如“-1/6”,而不是“1/-6”。

通分后,gcd化简 

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;


int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}

int main(){
    int T,op,a,b,c,d;
    scanf("%d",&T);
    while(T--){
        int x,y,g,flag=0;
        scanf("%d%d%d%d%d",&op,&a,&b,&c,&d);//a/b + c/d = (a*d+c*b)/(b*d)
        if(op==1){
            x = a*d + c*b;
            y = b*d;
            if(x*y<0)
                flag = 1;
            x = abs(x),y=abs(y);
            g = gcd(x,y);
            printf("%d/%d\n",x/g,y/g);
        }else{
            x = a*d - c*b;
            y = b*d;
            if(x*y<0)
                flag = 1;
            x = abs(x),y=abs(y);
            g = gcd(x,y);
            if(flag)
                printf("-%d/%d\n",x/g,y/g);
            else
                printf("%d/%d\n",x/g,y/g);
        }


    }

	return 0;
}

M.HJ浇花

链接:https://ac.nowcoder.com/acm/contest/322/M
来源:牛客网
 

题目描述

HJ养了很多花(99999999999999999999999999999999999盆),并且喜欢把它们排成一排,编号0~99999999999999999999999999999999998,每天HJ都会给他的花浇水,但是他很奇怪,他会浇n(1 <= n <= 2 * 105)次水,每次都会选择一个区间[l, r],(0 <= l <= r <= 106),表示对区间[l, r]的花都浇一次水。现在问你,通过这些操作之后,被浇了i(1 <= i <= n)次水的花的盆数。

输入描述:

输入:第一行一个n,表示HJ的操作次数,接下来的n行,表示每一次选择的浇水区间。

输出描述:

输出:输出n个数字Cnt1, Cnt2……Cntn,(用空格隔开)Cnti表示被浇了i次水的花的盆数。

示例1

输入

复制

3
0 3
1 3
3 8

输出

复制

6 2 1

示例2

输入

复制

3
1 3
2 4
5 7

输出

复制

5 2 0

说明

 

对于样例1的图形解释

被浇了1次的有:0, 4, 5, 6, 7, 8, cnt1 = 6

被浇了2次的有:1, 2.           cnt2 = 2

被浇了3次的有: 3 .            cnt3 = 3

 差分

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define repd(i,a,n) for(int i=n-1;i>=a;i--)
#define CRL(a,x) memset(a,x,sizeof(a))
const int N=2e6+5;
int a[N]={0};
map<int,int> M;
 
int main()
{
    int n,l,r,Max=0;
    scanf("%d",&n);
    rep(i,0,n){
        scanf("%d%d",&l,&r);
        a[l]++;
        a[r+1]--;
        if(r+1>Max) Max=r+1;
    }
    rep(i,1,Max+1) a[i]+=a[i-1];
    rep(i,0,Max+1) M[a[i]]++;
 
    map<int,int>::iterator iter=M.begin();
    rep(i,1,n+1) 
        printf("%d%c",M[i]," \n"[i==n]);
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41793113/article/details/89504482
今日推荐