• 牛客OI赛制测试赛2


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

    无序组数
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题目描述

    给出一个二元组(A,B)
    求出无序二元组(a,b) 使得(a|A,b|B)的组数
    无序意思就是(a,b)和(b,a) 算一组.

    输入描述:

    第一行数据组数 T(1≤T≤10000)
    接下来T行,每行两个正整数 A,B(1≤A,B≤10000)

    输出描述:

    共T行,每行一个结果
    示例1

    输入

    复制
    1
    4 6

    输出

    复制
    11

    说明

    样例解释:
    二元组如下:
    (1,1)(1,2)(1,3)(1,6)
    (2,1)(2,2)(2,3)(2,6)
    (4,1)(4,2)(4,3)(4,6)
    共12组.
    无序二元组如下:

    (1,1)(1,2)(1,3)(1,6)
    (2,2)(2,3)(2,6)
    (4,1)(4,2)(4,3)(4,6)
    共11组


    直接筛素数
     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int a[10005];
     6 
     7 void init(){
     8     for (int i = 1; i <= 10000; ++i){
     9         for (int j = i; j <= 10000; j += i){
    10             a[j]++;
    11         }
    12     }
    13 }
    14 
    15 int main(){
    16     int t;
    17     init();
    18     cin>>t;
    19     int x,y;
    20     while(t--){
    21         cin>>x>>y;
    22         int one = a[x];
    23         int two = a[y];
    24         int ans = __gcd(x,y);
    25         ans = a[ans];
    26         cout<<one*two-((ans-1)*ans)/2<<endl;
    27     }
    28     return 0;
    29 }

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

    路径数量
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题目描述

    给出一个 n * n 的邻接矩阵A.
    A是一个01矩阵 .
    A[i][j]=1表示i号点和j号点之间有长度为1的边直接相连.
    求出从 1 号点 到 n 号点长度为k的路径的数目.

    输入描述:

    第1行两个数n,k (20 ≤n ≤ 30,1 ≤ k ≤ 10)
    第2行至第n+1行,为一个邻接矩阵

    输出描述:

    题目中所求的数目
    示例1

    输入

    复制
    4 2
    0 1 1 0
    1 0 0 1
    1 0 0 1
    0 1 1 0

    输出

    复制
    2

    说明

    样例如图:
    第一条路径:1-2-4
    第二条路径:1-3-4
     
    矩阵乘法可以解决此问题。
     
     1 #include <bits/stdc++.h>
     2 #define pb push_back
     3 #define test(a) cout<<a<<endl
     4 #define ll long long int
     5 using namespace std;
     6 
     7 ll n,k,x;
     8 ll cnt = 0;
     9 ll v[32][32],b[32][32];
    10 ll vis[32][32];
    11 
    12 
    13 int main(){
    14     cin>>n>>k;
    15     for (int i = 1; i <= n; ++i){
    16         for (int j = 1; j <= n; ++j){
    17             cin>>v[i][j];
    18             vis[i][j] = v[i][j];
    19         }
    20     }
    21     k--;
    22     while(k--){
    23         memset(b,0,sizeof(b));
    24         for(int i = 1; i <= n; ++i){
    25             for(int j = 1; j <= n; ++j){
    26                 for(int p = 1; p <= n; ++p){
    27                     b[i][j] += v[i][p]*vis[p][j];
    28                 }
    29             }
    30         }
    31         for (int i = 1; i <= n; ++i){
    32             for (int j = 1; j <= n; ++j){
    33                 v[i][j] = b[i][j];
    34             }
    35         }
    36     }
    37     cout<<v[1][n]<<endl;
    38     return 0;
    39 }

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

    数列下标
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题目描述

    给出一个数列 A,求出一个数列B.
    其中Bi   表示 数列A中 Ai 右边第一个比 Ai 大的数的下标(从1开始计数),没有找到这一个下标  Bi 就为0
    输出数列B

    输入描述:

    第一行1个数字 n (n ≤ 10000)
    第二行n个数字第 i 个数字为 Ai (0 ≤ A≤ 1000000000)

    输出描述:

    一共一行,第 i 个数和第 i+1 个数中间用空格隔开.
    示例1

    输入

    复制
    6
    3 2 6 1 1 2

    输出

    复制
    3 3 0 6 6 0

    说明

    样例不用解释

    这题就用栈来模拟一下了。
     1 #include <bits/stdc++.h>
     2 #define test(a) cout<<a<<endl
     3 using namespace std;
     4 struct Node{
     5     int to,val;
     6 };
     7 stack<Node> sk;
     8 int an[10005];
     9 int n,x;
    10 int main(){
    11     cin>>n;
    12     for (int i = 1; i <= n; ++i){
    13         cin>>x;
    14         if(sk.empty()){
    15             sk.push(Node{i,x});
    16         }else{
    17             if(sk.top().val >= x){
    18                 sk.push(Node{i,x});
    19             }else{
    20                 while(!sk.empty() && sk.top().val < x){
    21                     an[sk.top().to] = i;
    22                     sk.pop();
    23                 }
    24                 sk.push(Node{i,x});
    25             }
    26         }
    27     }
    28     for(int i = 1; i <= n; ++i){
    29         cout<<an[i]<<" ";
    30     }
    31     cout<<endl;
    32     return 0;
    33 }

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

    星光晚餐
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题目描述

    Johnson和Nancy要在星光下吃晚餐。这是一件很浪漫的事情

     

    为了增加星光晚餐那浪漫的氛围,他拿出了一个神奇的魔法棒,并且可以按照一定的规则,改变天上星星的亮暗。

    Johnson想考考Nancy,在他挥动魔法棒后,会有多少颗星星依旧闪耀在天空。他知道,Nancy一定会一口说出答案。

    Nancy当然知道怎么做啦,但她想考考你!

    Johnson先将天上n个星星排成一排,起初它们都是暗的。

    他告诉他的妹子,他将挥动n次魔法棒,第i次挥动会将编号为i的正整数倍的星星的亮暗反转,即亮的星星转暗,暗的星星转亮。

    Johnson想问Nancy,最终会有多少个星星依旧闪亮在天空。


    输入描述:

    一个整数n,含义请见题目描述。

    输出描述:

    一个整数ans,即n次操作后会有多少个星星依旧闪亮。
    示例1

    输入

    复制
    3

    输出

    复制
    1
    示例2

    输入

    复制
    7

    输出

    复制
    2

    备注:

    对于60%的数据:n≤2×10
    6

    对于100%的数据:n≤10
    18
    签到题
     1 #include <bits/stdc++.h>
     2 #define test(a) cout<<a<<endl
     3 #define ll long long int
     4 using namespace std;
     5 ll n,x;
     6 int main(){
     7     cin>>n;
     8     int ans = (int)sqrt(n);
     9     cout<<ans<<endl;
    10     return 0;
    11 }

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

    括号序列
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    给定括号长度N,给出一串括号(只包含小括号),计算出最少的交换(两两交换)次数,使整个括号序列匹配。
    我们认为一个括号匹配,即对任意一个')',在其左侧都有一个'('与它匹配,且他们形成一一映射关系。

    输入描述:

    第一行:整数N,表示括号序列长度
    第二行:一个字符串,表示括号

    输出描述:

    一个整数,表示最少的交换次数
    示例1

    输入

    复制
    6
    (()))(

    输出

    复制
    1
    示例2

    输入

    复制
    6
    )))(((

    输出

    复制
    2

    备注:

    对于80%的数据:n≤3000
    对于100%的数据,n≤5×10
    6
     
    类似签到题,走一遍字符串就行。
     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 string s;
     5 int n;
     6 int main(){
     7     ios::sync_with_stdio(0);
     8     cin.tie(0),cout.tie(0);
     9     cin>>n;
    10     cin>>s;
    11     int l = 0;
    12     int ans = 0;
    13     for(int i = 0; i < s.length(); i++){
    14         if(s[i]=='(')
    15             l++;
    16         else{
    17             if(l==0)
    18                 ans++;
    19             else
    20                 l--;
    21         }
    22     }
    23     int cnt = ans%2==0?ans/2:ans/2+1;
    24     cout<<cnt<<endl;
    25     return 0;
    26 }

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

    假的数学游戏
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    输入一个整数X,求一个整数N,使得N!恰好大于XX

    输入描述:

    第一行:一个整数X

    输出描述:

    第一行:一个整数N
    示例1

    输入

    复制
    7

    输出

    复制
    10

    备注:

    每个测试点所对应的X满足:

    第i个测试点输入的值为第i-1个测试点输入的值乘以10再加上7。

    特别的,第一个测试点所输入的值为7。

    提示:数据共有10组。

    这题其实可以打表做。但是那样就是失去了做题的本意了。
    所以最好的方法就是斯特林公式加二分查找。

    两边加个log10。

    
    
     1 #include <bits/stdc++.h>
     2 
     3 #define ll long long int
     4 #define pi acos(-1)
     5 #define eps 1e-10
     6 #define e 2.718281828459
     7 using namespace std;
     8 
     9 int main(){
    10     ll t;
    11     cin>>t;
    12     double ans = t*log10(t);
    13     ll l = 1,r = 1e15;
    14     while(r - l > 1){
    15         ll mid = (l + r)>>1;
    16         double cnt = log10(sqrt(2.0 * mid * pi)) + mid * log10(mid / e);
    17         if(cnt - ans > eps){
    18             r = mid;
    19         }else{
    20             l = mid;
    21         }
    22     }
    23     cout<<r<<endl;
    24     return 0;
    25 }
  • 相关阅读:
    Elasticsearch:使用function_score及soft_score定制搜索结果的分数
    Elasticsearch:Elasticsearch中的refresh和flush操作指南
    Elasticsearch:top_hits aggregation
    Linux 容器的使用
    编译Linux内核
    GIT的使用
    Linux 小知识翻译
    Linux 小知识翻译
    Linux 小知识翻译
    Linux 小知识翻译
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/9608207.html
Copyright © 2020-2023  润新知