1. 程式人生 > >牛客OI賽制測試賽2

牛客OI賽制測試賽2

port 例如 其中 efi i+1 png color pop 長度

鏈接: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 ≤ Ai ≤ 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 }

牛客OI賽制測試賽2