2018年東北農業大學春季校賽

---恢復內容開始---c++

連接:https://www.nowcoder.com/acm/contest/93/B
來源:牛客網

數組

B-wyh的矩陣

題目描述

給你一個n*n矩陣,按照順序填入1到n*n的數,例如n=5,該矩陣以下測試

1spa

2code

3blog

4ci

5字符串

6get

7it

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

如今讓你鏈接相鄰兩條邊的中點,而後只保留他們圍成封閉圖形區域的數字,那麼這個矩陣變爲

 

 

3

 

 

 

7

8

9

 

11

12

13

14

15

 

17

18

19

 

 

 

23

 

 

如今大家涵哥讓你求變化後的矩陣的全部元素的和爲多少

輸入描述:

輸入第一行一個整數T(1<=T<=100)
接下來有T組測試數據,每組測試數據輸入一個整數n(3<=n<=10000)
保證輸入的n爲奇數

輸出描述:

對於每組測試數據,輸出對應答案
示例1

輸入

2
3
5

輸出

25
169
找規律,每一行取中間的1,3,5.....maxn....5,3,1個數,就是最中間那個數的1,3,5...倍數,每次累加便可。
 1 #include<bits/stdc++.h>
 2 using namespace std;  3 #define LL long long
 4 int main()  5 {  6     LL n,i,j,k=0,s=0,l,r;  7     int t;  8     cin>>t;  9     while(t--){ 10         cin>>n; 11         s=0; 12         LL tt=n/2+1,h=1; 13         for(i=1;i<=n/2+1;++i){ 14             s+=tt*h; 15             //cout<<tt*h<<endl;
16             h+=2; 17             tt+=n; 18  } 19         h-=4; 20         //tt+=n;
21         for(i=n/2+2;i<=n;++i){ 22             s+=tt*h; 23         // cout<<tt*h<<endl;
24             h-=2; 25             tt+=n; 26  } 27             cout<<s<<endl; 28  } 29  
30     return 0; 31 }

 

 

連接:https://www.nowcoder.com/acm/contest/93/D
來源:牛客網

題目描述

給你一個n*m的迷宮,這個迷宮中有如下幾個標識:

s表明起點

t表明終點

x表明障礙物

.表明空地

如今大家涵哥想知道能不能從起點走到終點不碰到障礙物(只能上下左右進行移動,而且不能移動到已經移動過的點)。

輸入描述:

輸入第一行一個整數T(1<=T<=10)
接下來有T組測試數據,對於每一組測試數據,第一行輸入2個數n和m(1<=n,m<=500)
接下來n行,每行m個字符表明這個迷宮,每一個字符都是上面4箇中的一種
數據保證只有一個起點和一個終點

輸出描述:

對於每一組測試數據,若是能夠的話輸出YES,不能夠的話輸出NO
示例1

輸入

1
3 5
s...x
x...x
...tx

輸出

YES
直接深搜一遍就行了。
 1 #include<bits/stdc++.h>
 2 using namespace std;  3 #define LL long long
 4 char e[550][550];  5 bool vis[510][510];  6 int fx[4][2]={1,0,0,1,-1,0,0,-1};  7 int n,m;  8 void dfs(int x,int y)  9 { 10     vis[x][y]=1; 11     for(int i=0;i<4;++i){ 12         int dx=x+fx[i][0]; 13         int dy=y+fx[i][1]; 14         if(dx<1||dx>n||dy<1||dy>m||vis[dx][dy]==1||e[dx][dy]=='x') continue; 15  dfs(dx,dy); 16  } 17 } 18 int main() 19 { 20     int t,i,j,k; 21     cin>>t; 22     while(t--){int sx,sy,tx,ty; 23         cin>>n>>m; 24         for(i=1;i<=n;++i) scanf("%s",e[i]+1); 25         for(i=1;i<=n;++i){ 26             for(j=1;j<=m;++j){//cin>>e[i][j]; 27                 //scanf("%c",&e[i][j]);
28                 if(e[i][j]=='s'){ 29                     sx=i; 30                     sy=j; 31  } 32                 else if(e[i][j]=='t'){ 33                     tx=i; 34                     ty=j; 35  } 36  } 37  } 38         memset(vis,0,sizeof(vis)); 39  dfs(sx,sy); 40         vis[tx][ty]?puts("YES"):puts("NO"); 41  } 42     return 0; 43 }

 

 

連接:https://www.nowcoder.com/acm/contest/93/E
來源:牛客網

題目描述

這個問題很簡單,就是問你n的階乘末尾有幾個0?

輸入描述:

輸入第一行一個整數T(1<=T<=100),表明測試組數
接下來T行,每行一個數n(1<=n<=10^9)

輸出描述:

對於每組測試數據,輸出對應答案
示例1

輸入

5
1
2
3
4
5

輸出

0
0
0
0
1
經典題目,統計因子5的個數便可。
 1 #include<bits/stdc++.h>
 2 using namespace std;  3 #define LL long long 
 4 int f(int n){  5     int tt=5,s=0;  6     while(n/tt){  7         s+=n/tt;  8         tt*=5;  9  } 10     return s; 11 } 12 int main() 13 { 14     int t,n,i,j; 15     cin>>t; 16     while(t--){ 17         cin>>n; 18         cout<<f(n)<<endl; 19  } 20     return 0; 21  }

 

連接:https://www.nowcoder.com/acm/contest/93/F
來源:牛客網

題目描述

大家wyh學長給你n個點,讓你分紅2個集合,而後讓你將這n個點進行兩兩鏈接在一塊兒,鏈接規則是這樣的

1. 鏈接的兩個點必須在不一樣的兩個集合

2. 一個集合內部任意兩個點之間不能相連

如今,wyh學長鬚要讓你將這n個點任意分紅2個集合以後,最多能鏈接多少條邊?

輸入描述:

輸入第一行一個整數T(1<=T<=100000)
接下來T組測試數據,每組測試數據輸入一個整數n(1<=n<=100000)

輸出描述:

對於每組測試數據,輸出對應答案
示例1

輸入

4
0
1
2
4

輸出

0
0
1
4

說明

對於4的狀況,設4個點爲A,B,C,D
第一個集合元素爲 A,B
第二個集合元素爲C,D
鏈接的邊爲AC,AD,BC,BD
此時爲最大狀況,因此答案爲4
貪心,分紅兩個大小最接近的數便可。
 1 #include<bits/stdc++.h>
 2 using namespace std;  3 #define LL long long 
 4 int main()  5 {  6  LL n,i,j,t;  7     cin>>t;  8     while(t--){  9         scanf("%lld",&n); 10         printf("%lld\n",(n/2)*(n-n/2)); 11  } 12     return 0; 13 }

 

 

連接:https://www.nowcoder.com/acm/contest/93/I
來源:牛客網

題目描述

wyh學長如今手裏有n個物品,這n個物品的重量和價值都告訴你,而後如今讓你從中選取k個,問你在全部可能選取的方案中,最大的單位價值爲多少(單位價值爲選取的k個物品的總價值和總重量的比值)

輸入描述:

輸入第一行一個整數T(1<=T<=10)
接下來有T組測試數據,對於每組測試數據,第一行輸入兩個數n和k(1<=k<=n<=100000)
接下來有n行,每行兩個是a和b,表明這個物品的重量和價值

輸出描述:

對於每組測試數據,輸出對應答案,結果保留兩位小數
示例1

輸入

1
3 2
2 2
5 3
2 1

輸出

0.75

說明

對於樣例來講,咱們選擇第一個物品和第三個物品,達到最優目的
經典的分數規劃,二分這個最優解,對於知足條件x的一組物品{(v1,w1),(v2,w2)......(vk,wk)}必定知足:
SUM{v}/sum{w}>=x,即(v1-x*w1)+(v2-x*w2)+...+(vk-x*wk)>=0,顯然咱們對於每個x,能夠先處理出p[i]=v[i]-x*w[i]的數組,而後選擇前k大的元素檢查。
 1 #include<bits/stdc++.h>
 2 using namespace std;  3 #define eps 1e-6
 4 double w[100010],v[100010],p[100010];  5 int n,k;  6 bool ok(double x){  7     for(int i=1;i<=n;++i){  8         p[i]=v[i]-x*w[i];  9  } 10     sort(p+1,p+1+n,greater<double>()); 11     double s=0; 12     for(int i=1;i<=k;++i) 13         s+=p[i]; 14     return s>=0; 15 } 16 int main() 17 { 18     int i,j; 19     int t; 20     cin>>t; 21     while(t--){ 22         cin>>n>>k; 23         for(i=1;i<=n;++i){ 24             scanf("%lf%lf",w+i,v+i); 25  } 26         double l=0,r=100010; 27         while(abs(l-r)>=eps){ 28             double m=r-(r-l)/2; 29             if(ok(m)){ 30                 l=m; 31  } 32             else{ 33                 r=m; 34  } 35  } 36         printf("%.2f\n",l); 37  } 38     return 0; 39 }
 
                         

 

 

連接:https://www.nowcoder.com/acm/contest/93/K
來源:牛客網

題目描述

wyh學長特別喜歡斐波那契數列,F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2)

一天他突發奇想,想求F(a^b)%c

輸入描述:

輸入第一行一個整數T(1<=T<=100),表明測試組數
接下來T行,每行三個數 a,b,c (a,b<=2^64) (1<c<1000)

輸出描述:

輸出第a^b項斐波那契數對c取餘的結果
示例1

輸入

3
1 1 2
2 3 1000
32122142412412142 124124124412124 123

輸出

1
21
3

找循環節。
 1 #include<bits/stdc++.h>
 2 using namespace std;  3 #define LL  unsigned long long
 4 LL f[1001000];  5 LL qpow(LL a,LL b,LL c){  6     LL r=1;  7     while(b){  8         if(b&1) r=r*a%c;  9         a=a*a%c; 10         b>>=1; 11  } 12     return r; 13 } 14 int main() 15 { 16  LL t,a,b,c,i,j,k; 17     cin>>t; 18     while(t--){ 19         cin>>a>>b>>c; 20  LL tot; 21         f[0]=0,f[1]=1; 22         for(i=2;i<=1001000;++i){ 23             f[i]=(f[i-1]+f[i-2])%c; 24             if(f[i-1]==0&&f[i]==1){ 25                 tot=i-1; 26                 break; 27  } 28  } 29         cout<<f[qpow(a%tot,b,tot)]<<endl; 30  } 31     return 0; 32 }

 

 

 

連接:https://www.nowcoder.com/acm/contest/93/L
來源:牛客網

題目描述

大家wyh學長小時候住在河邊,由於周圍的生態環境很是好,因此常常會有天鵝浮在湖面上,每隻天鵝都長得不同,它們偶爾排成一排,偶爾分散開,偶爾也會去其餘河畔,wyh學長爲了統計它們的個數,編了一個程序賦予它們一個「萌」值,可是這些天鵝很不聽話,一下子會從別的地方游過來一兩隻,一下子又會在統計過程當中遊走一兩隻,如今請你幫他完成統計任務。

輸入描述:

共有T(T<=10)組數據,每組數據第一行爲兩個數 N, M (N,M <= 500000),表明有N只天鵝和M次操做,接下來一行是N個數字,下面M行首先會輸入一個字符串S,接着會有三類操做,若是S是「insert」,接着輸入一個正整數a,表明插入一隻「萌」值爲a的天鵝,若是S是「delete」,接着輸入一個正整數a,表明刪除一隻「萌」值爲a的天鵝,若是S是「query」,接着輸入一個正整數k,表明查詢「萌」值第k大的天鵝。
萌值爲[1,1000000000],而且保證必定存在第k大

輸出描述:

對應每次詢問,輸出詢問結果。
示例1

輸入

1
5 4
6 4 2 9 1
query 2
insert 7
delete 6
query 2

輸出

6
7
值域線段樹跑一波。
 1 #include<bits/stdc++.h>
 2 using namespace std;  3 #define LL  long long
 4 int sumn[4000000],ch[4000000][2],tot;  5 void insert(int id,int L,int R,int a){  6     int M=(L+R)/2;  7     if(L==R){  8         sumn[id]++;  9         return; 10  } 11     if(a<=M){ 12         if(!ch[id][0]) ch[id][0]=tot++; 13         insert(ch[id][0],L,M,a); 14  } 15     else{ 16         if(!ch[id][1]) ch[id][1]=tot++; 17         insert(ch[id][1],M+1,R,a); 18  } 19     sumn[id]=sumn[ch[id][0]]+sumn[ch[id][1]]; 20 } 21  
22 void delet(int id,int L,int R,int a){ 23     int M=(L+R)/2; 24     if(L==R){ 25         sumn[id]--; 26         return; 27  } 28     if(a<=M){ 29         //if(!ch[id][0]) ch[id][0]=tot++;
30         delet(ch[id][0],L,M,a); 31  } 32     else{ 33     // if(!ch[id][1]) ch[id][1]=tot++;
34         delet(ch[id][1],M+1,R,a); 35  } 36     sumn[id]=sumn[ch[id][0]]+sumn[ch[id][1]]; 37 } 38  
39 int query(int id,int L,int R,int a){ 40     //cout<<L<<' '<<R<<' '<<sumn[id]<<endl;
41     int M=(L+R)/2; 42     if(L==R){ 43         return L; 44  } 45     if(sumn[ch[id][1]]>=a){ 46         return query(ch[id][1],M+1,R,a); 47  } 48     else
49         return query(ch[id][0],L,M,a-sumn[ch[id][1]]); 50 } 51 int main() 52 { 53     int t,n,m,i,j,k; 54     int a,b,c; 55     char s[100]; 56     cin>>t; 57     while(t--){ 58         cin>>n>>m; 59         memset(sumn,0,sizeof(sumn)); 60         memset(ch,0,sizeof(ch)); 61         tot=2; 62         for(i=1;i<=n;++i){ 63             scanf("%d",&a); 64             insert(1,1,1000000000,a); 65  } 66         while(m--){ 67             scanf("%s%d",s,&a); 68             if(!strcmp(s,"query")){ 69                 printf("%d\n",query(1,1,1000000000,a)); 70  } 71             else if(!strcmp(s,"insert")){ 72                 insert(1,1,1000000000,a); 73  } 74             else { 75                 delet(1,1,1000000000,a); 76  } 77  } 78  } 79     return 0; 80 }
相關文章
相關標籤/搜索