DAY_3

今天做做BNU幾年前的網絡賽題目,,,

A題:

自然界充滿了神奇,各種植物都有着它們奇特的繁衍方式。大蒜是一種非常普通的調味品,但是在城市長大的我們,有多少人知道它是怎麼培育出來的嗎?
其實,我們將一團大蒜掰成若干蒜瓣,將蒜瓣分別埋到土裏。一年之後,每一個蒜瓣都能長成一團大蒜。
我們假設每團大蒜都由8瓣蒜瓣構成,那麼將一團大蒜掰開種下去,第一年就能收穫8團大蒜;再將所有的大蒜都種下去,第二年就能收穫64團大蒜。
現在我們手裏只有一團大蒜,但是我們想知道第n年(1<=n<=10)我們最多能收穫多少團大蒜。

Input

輸入的第一行爲一個整數casen,表示有casen組數據。
接下來有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: Main
LiuLibo要舉辦一個party,由於場地、資金都比較有限,他決定在他所有的朋友中選擇n個人來參加party。在LiuLibo的朋友中,不少人是相互認識的。LiuLibo就想,如果在來參加party的朋友之中,相互認識的人比較多,那麼大家都容易玩得開心。另一方面他又想,如果有三個人兩兩相互認識,那麼在party上可能這三個人就會形成一個小團體,而不願意去結識其他朋友。於是問題就來了,他希望參加party的人儘可能是相互認識的,但是不會邀請兩兩之間相互認識的三個人。
現在他想知道,在最理想的情況下,最多他能邀請到多少對相互認識的人。
舉例說明一下,如果LiuLibo的兩個朋友丁丁和迪迪是相互認識的,另外丁丁和瓜瓜相互認識,但是瓜瓜和迪迪不認識,那麼邀請這三個人蔘加party是符合條件的。其中包含兩對相互認識的人:丁丁——迪迪、丁丁——瓜瓜。

Input

輸入包括多組數據,每組數據爲一個整數n(1≤ n ≤ 10000),表示LiuLibo打算邀請的朋友人數。
如果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以及明文,程序都能輸出正確的密文。

Input

第一行X,Y(0 < X <= 200,0 < Y <= 200)。
第二行至末尾每行均爲一個明文(保證明文中字母的個數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題:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章