今天做做BNU幾年前的網絡賽題目,,,
A題:
自然界充滿了神奇,各種植物都有着它們奇特的繁衍方式。大蒜是一種非常普通的調味品,但是在城市長大的我們,有多少人知道它是怎麼培育出來的嗎?
其實,我們將一團大蒜掰成若干蒜瓣,將蒜瓣分別埋到土裏。一年之後,每一個蒜瓣都能長成一團大蒜。
我們假設每團大蒜都由8瓣蒜瓣構成,那麼將一團大蒜掰開種下去,第一年就能收穫8團大蒜;再將所有的大蒜都種下去,第二年就能收穫64團大蒜。
現在我們手裏只有一團大蒜,但是我們想知道第n年(1<=n<=10)我們最多能收穫多少團大蒜。
其實,我們將一團大蒜掰成若干蒜瓣,將蒜瓣分別埋到土裏。一年之後,每一個蒜瓣都能長成一團大蒜。
我們假設每團大蒜都由8瓣蒜瓣構成,那麼將一團大蒜掰開種下去,第一年就能收穫8團大蒜;再將所有的大蒜都種下去,第二年就能收穫64團大蒜。
現在我們手裏只有一團大蒜,但是我們想知道第n年(1<=n<=10)我們最多能收穫多少團大蒜。
Input
輸入的第一行爲一個整數casen,表示有casen組數據。
接下來有casen行,每一行爲一組測試數據。每行包含一個整數n,表示我們想知道第n年的收成。
接下來有casen行,每一行爲一組測試數據。每行包含一個整數n,表示我們想知道第n年的收成。
Output
對每組測試數據,輸出一個整數,表示第n年最多的收成。每組輸出佔一行。
Sample Input
3 1 5 10
Sample Output
8 32768 1073741824
思路:這題沒什麼好說的,只要求出pow(8,n)就是答案了,關係也很明確。
代碼:
# include<cstdio>
# include<iostream>
# include<cmath>
using namespace std;
int main(void)
{
int icase = 0;
int t;cin>>t;
while ( t-- )
{
int n;cin>>n;
long long ans = pow(8,n);
printf("%ld\n",ans);
//cout<<pow(8,n)<<endl;
}
}
B題:
LiuLibo’s Party
Time Limit: 1000ms
Memory Limit: 65535KB
64-bit integer IO format: %lld
Java class name: MainLiuLibo要舉辦一個party,由於場地、資金都比較有限,他決定在他所有的朋友中選擇n個人來參加party。在LiuLibo的朋友中,不少人是相互認識的。LiuLibo就想,如果在來參加party的朋友之中,相互認識的人比較多,那麼大家都容易玩得開心。另一方面他又想,如果有三個人兩兩相互認識,那麼在party上可能這三個人就會形成一個小團體,而不願意去結識其他朋友。於是問題就來了,他希望參加party的人儘可能是相互認識的,但是不會邀請兩兩之間相互認識的三個人。
現在他想知道,在最理想的情況下,最多他能邀請到多少對相互認識的人。
舉例說明一下,如果LiuLibo的兩個朋友丁丁和迪迪是相互認識的,另外丁丁和瓜瓜相互認識,但是瓜瓜和迪迪不認識,那麼邀請這三個人蔘加party是符合條件的。其中包含兩對相互認識的人:丁丁——迪迪、丁丁——瓜瓜。
現在他想知道,在最理想的情況下,最多他能邀請到多少對相互認識的人。
舉例說明一下,如果LiuLibo的兩個朋友丁丁和迪迪是相互認識的,另外丁丁和瓜瓜相互認識,但是瓜瓜和迪迪不認識,那麼邀請這三個人蔘加party是符合條件的。其中包含兩對相互認識的人:丁丁——迪迪、丁丁——瓜瓜。
Input
輸入包括多組數據,每組數據爲一個整數n(1≤ n ≤ 10000),表示LiuLibo打算邀請的朋友人數。
如果n=0則表示輸入結束。
如果n=0則表示輸入結束。
Output
對每組測試數據,輸出一行答案,答案爲一個整數,指出參加party的人最多可能有多少對是相互認識的。
Sample Input
1 2 3 0
Sample Output
0 1 2
思路:其實就是一個二分圖的匹配的問題了,任意畫一個二分圖,然後把兩個獨立集合中的頂點進行連線,如果能相互連接,且有邊的個數,就是相互認識的人數了。
代碼:
# include<cstdio>
# include<iostream>
# include<cstring>
# include<algorithm>
# include<string>
# include<queue>
using namespace std;
# define inf 0x3f3f3f3f
# define MAX 56
int a[MAX];
int main(void)
{
int n;
while ( cin>>n )
{
if ( n==0 )
break;
int a = n/2;
int b = n-a;
cout<<a*b<<endl;
}
return 0;
}
C題:
解題思路:
這道題就是判斷一個集合的交集,然後把這些交集中的元素按照從小到大的順序輸出來就可以了,其實也沒什難度的,就是把這種求交集的模板要記住了,而且這道題也可以用vector來寫,,以前一直不會用STL這幾個容器,現在隨着見到的題目的增多,越來越會做了。。。
代碼:
# include<cstdio>
# include<iostream>
# include<vector>
# include<algorithm>
using namespace std;
# define MAX 10000+4
int a[MAX];
int b[MAX];
int main(void)
{
int t;cin>>t;
while ( t-- )
{
int m;cin>>m;
int val;
for ( int i = 0;i < m;i++ )
{
cin>>a[i];
}
int m2;
cin>>m2;
for ( int i = 0;i < m2;i++ )
{
cin>>b[i];
}
sort(a,a+m);
sort(b,b+m2);
int flag = 0;
for ( int p = 0,q = 0;p < m&&q < m2; )
{
if ( a[p] > b[q] )
{
q++;
}
else if ( a[p] < b[q] )
{
p++;
}
else
{
if ( flag )
{
cout<<" ";
}
cout<<a[p];
flag = 1;
p++;
q++;
}
}
if ( !flag )
{
cout<<"empty"<<endl;
}
cout<<endl;
}
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int m,val;
cin >> m;
vector<int> v1,v2;
for (int j = 0; j < m; ++j) {
cin >> val;
v1.push_back(val);
}
cin >> m;
for (int j = 0; j < m; ++j) {
cin >> val;
v2.push_back(val);
}
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
int first = true;
for (int p= 0, q = 0;p <v1.size() && q < v2.size();) {
if (v1[p] < v2[q])
++p;
else if (v1[p] > v2[q])
++q;
else {
if (!first)
cout << " ";
cout << v1[p];
first = false;
++p;
++q;
}
}
if (first)
cout << "empty";
cout << endl;
}
}
D題:
解題思路:說是一道求期望的問題,其實是一道求總分的題目,因爲不管怎麼樣的旋轉,一個方塊相對於另外一個方塊的旋轉情況只有4鍾,然後得到了這四種旋轉的座標關係,我們就可以了得到總的分數了,然後結果除以4就是最終的答案了。
代碼:
# include<cstdio>
# include<iostream>
# include<cstring>
using namespace std;
# define MAX 9
char grid1[MAX][MAX];
char grid2[MAX][MAX];
int S ( char x,char y )
{
int result = 0;
if ( x==y )
{
switch( x )
{
case '.':
result = 1;
break;
case '*':
result = 2;
break;
case '#':
result = 3;
break;
default:
result = 0;
break;
}
}
return result;
}
int main(void)
{
for ( int i = 0;i < 8;i++ )
{
scanf("%s",grid1[i]);
}
for ( int i = 0;i < 8;i++ )
{
scanf("%s",grid2[i]);
}
int score = 0;
for ( int i = 0;i < 8;i++ )
{
for ( int j = 0;j < 8;j++ )
{
score += S( grid1[i][j],grid2[j][7-i] );
score += S( grid1[i][j],grid2[7-i][7-j] );
score += S( grid1[i][j],grid2[7-j][i] );
score += S( grid1[i][j],grid2[i][j] );
}
}
printf("%.2lf\n",1.0*score/4);
}
E題:
信息戰(一)——加密程序
Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format: %lld
Java class name: Main在戰爭時期,各個國家都要保證軍隊的行動保密性,所以在信息傳達時會採取各種加密方法。有一天,A國安全局成員Oo(也就是傳說中的ZSL),發明了一種對指令的加密方法。具體操作如下,取兩個正整數X、Y,對於一段明文字符串,將其按行填入一個X行Y列的矩陣中(非字母不填、而且所有字母要求權轉換爲大寫),若未填滿,則按字母表順序順次填充(’A’…’Z’循環填充)。比如對於X=3,Y=3,明文爲”Problem”時,矩陣填充後的結果爲:
PRO
BLE
MAB
這樣,Oo就得到了一個矩陣,將他按列輸出就得到了Oo所要的的密文“PBMRLAOEB”。由於A國編程人員奇缺。所以Oo向你求助,希望你能夠幫助他寫一個加密程序,從而使得對於任意給定的X、Y以及明文,程序都能輸出正確的密文。
PRO
BLE
MAB
這樣,Oo就得到了一個矩陣,將他按列輸出就得到了Oo所要的的密文“PBMRLAOEB”。由於A國編程人員奇缺。所以Oo向你求助,希望你能夠幫助他寫一個加密程序,從而使得對於任意給定的X、Y以及明文,程序都能輸出正確的密文。
Input
第一行X,Y(0 < X <= 200,0 < Y <= 200)。
第二行至末尾每行均爲一個明文(保證明文中字母的個數N <= X*Y)。
第二行至末尾每行均爲一個明文(保證明文中字母的個數N <= X*Y)。
Output
對於每一行明文輸出對應的一行密文。
Sample Input
3 3 Problem t e s t l I 156-*/- S t u 45/-90 N I v \908() 8768 *er #!@$& S a L
Sample Output
PBMRLAOEB TTCEADSBE LTCIADSBE UVSNEAIRL思路:有關字符串和數組的簡單的處理問題,但是這道題中,讓我學到了很多知識,也爲以後打div2墊下了基礎,就是用一個cnt變量,來控制放入的字符,當我們把一個一維的字符串放入一個二維的字符數組中時,我們所需要做的其實就是記錄每一步的變化,用 cnt/y 來控制橫向座標,用cnt%y來控制縱向座標,再加一個while(cnt<x*y),來處理後續的一些工作了。。
當然在關於小寫字母轉換成爲大寫字母的過程中,我也明確了用 s[i]-' a' + 'A' 來表示。。。還有就是在末尾添加字符的過程中,要用到 alpa+'A' ,alpa = ( alpa+1)%26.
代碼:
# include<cstdio>
# include<iostream>
# include<cstring>
# include<algorithm>
# include<cmath>
# include<string>
# include<vector>
# include<queue>
# include<set>
# include<map>
using namespace std;
# define inf 0x3f3f3f3f
# define eps 1e-7
# define MAX 233
char s[MAX*MAX];
char grid[MAX][MAX];
int main(void)
{
int x,y;cin>>x>>y;
gets(s);
while ( gets(s) )
{
int len = strlen(s);
int cnt = 0;
for ( int i = 0;i < len;i++ )
{
if ( s[i] <= 'z'&& s[i] >= 'a' )
{
grid[cnt/y][cnt%y] = s[i]-'a'+'A';
cnt++;
}
else if ( s[i] <= 'Z'&&s[i] >= 'A' )
{
grid[cnt/y][cnt%y] = s[i];
cnt++;
}
}
int alp = 0;
while ( cnt < x*y )
{
grid[cnt/y][cnt%y] = alp+'A';
cnt++;
alp = (1+alp)%26;
}
for ( int i = 0;i < y;i++ )
{
for ( int j = 0;j < x;j++ )
{
cout<<grid[j][i];
}
}
cout<<endl;
}
return 0;
}
F題:
G題:
H題:
I題:
J題: