1. 程式人生 > 實用技巧 >ACM-NEFU-2020大一寒假培訓三(暴力)

ACM-NEFU-2020大一寒假培訓三(暴力)

A.二倍的問題

Description

給定2到15個不同的正整數,你的任務是計算這些數裡面有多少個數對滿足:數對中一個數是另一個數的兩倍。比如給定1 4 3 2 9 7 18 22,得到的答案是3,因為2是1的兩倍,4是2個兩倍,18是9的兩倍。 

Input

輸入包括n組測試資料。每組資料包括一行,給出2到15個兩兩不同且小於100的正整數。每一行最後一個數是0,表示這一行的結束後,這個數不屬於那2到15個給定的正整數。

Output

對每組輸入資料,輸出一行,給出有多少個數對滿足其中一個數是另一個數的兩倍。

Sample Input

3
1 4 3 2 9 7 18 22 0
2 4 8 10 0
7 5 11 13 1 3 0

Sample Output

3
2
0

Code

#include<bits/stdc++.h>

using namespace std;

int main()
{
	int vis[25],a[25];
	int t,x,p,ans;
	cin>>t;
	while(t--)
	{
		memset(vis,0,sizeof(vis));
		p=ans=0;
		while(cin>>x&&x)
		{
			p++;
			a[p]=x;
		}
		sort(a+1,a+p+1);
		for(int i=1;i<=p;i++)
		{
			if(vis[a[i]]==1)	ans++;
			vis[2*a[i]]=1;
		}
		cout<<ans<<endl;
	}
	return 0;
}

B.大樂透

Description

在小明曾經玩過的一種對號碼的紙牌遊戲(樂透)裡,玩家必須從{1,2,……,49}中選擇6個數。玩Lotto的一個流行策略是(雖然它並不增加你贏的機會):就是從這49個數中,選出k(k&gt;6)個數組成一個子集S,然後只從S裡拿出牌來玩幾局遊戲。例如,k=8,s={1,2,3,5,8,13,21,34},那麼有28場可能的遊戲:[1,2,3,5,8,13],[1,2,3,5,8,21],[1,2,3,5,8,34],[1,2,3,5,13,21],……,[3,5,8,13,21,24]。
讀取數字k和一組數S,輸出由S中的陣列成的所有可能的遊戲。

Input

輸入資料有多組,每組一行,每行有多個整數,其中第一個整數為數字k,接下來有k個整數,即子集S。當k為0,輸入結束。

Output

輸出由S中的陣列成的所有可能的遊戲。每種遊戲一行。

Sample Input

7 1 2 3 4 5 6 7
0

Sample Output

1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int k,num[1000];
	while(1)
	{
		cin>>k;
		if(k==0)break;
		for(int i=0;i<k;i++)
		{
			cin>>num[i];
		}
		for(int i=0;i<k;i++)
		{
			for(int j=i+1;j<k;j++)
			{
				for(int l=j+1;l<k;l++)
				{
					for(int m=l+1;m<k;m++)
					{
						for(int n=m+1;n<k;n++)
						{
							for(int o=n+1;o<k;o++)
							{
								printf("%d %d %d %d %d %d\n",num[i],num[j],num[l],num[m],num[n],num[o]);
							}
						}
					}
				}
			}
		}
	}
	return 0;
}

C.密碼箱

Description

小明的密碼箱打不開了,小明的密碼箱是傳統的3位滾輪密碼。小明完全不記得他的密碼了,所以他從 000開始以升序開始嘗試,他已經試到第abc位密碼了,可是箱子還是沒有開啟,他希望你將之後所有可能嘗試的密碼輸出,這樣他就可以完全不去思考,讓他波動密碼盤更有效率

Input

每行輸入一個整數n(0 &lt; n &lt; 1000);n沒有字首0。

Output

n之後所有可能嘗試的密碼;輸出有字首0的。

Sample Input

989

Sample Output

990
991
992
993
994
995
996
997
998
999

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	while(cin>>n)
	{
		for(int i=n+1;i<1000;i++)
		{
			if(i<10)	cout<<"0";
			if(i<100)	cout<<"0";
			cout<<i<<endl;
		}
	}
	return 0;
}

D.字串統計

Description

對於給定的一個字串,統計其中數字字元出現的次數。

Input

輸入資料有多組,第一行是一個整數n,表示測試例項的個數,後面跟著n行,每行包括一個由字母和數字組成的字串。

Output

對於每個測試例項,輸出該串中數值的個數,每個輸出佔一行。

Sample Input

2
asdfasdf123123asdfasdf
asdf111111111asdfasdfasdf

Sample Output

6
9

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n,ans;
	string s;
	cin>>n;
	while(n--)
	{
		ans=0;
		cin>>s;
		for(int i=0;i<s.size();i++)
		{
			if(s[i]>='0'&&s[i]<='9')	ans++;
		}
		cout<<ans<<endl;
	}
	return 0;
}

E.醜數

Description

只有質數2,3,5,7這幾個作為因子的數叫做,醜數,比如前20個醜數是(從小到大來說) 1,2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24和25.

Input

我們給你個n(1&lt;=m&lt;=5842)當輸入n為0結束。

Output

輸出第n個醜數。每個數一行。

Sample Input

1
2
3
4
11

Sample Output

1
2
3
4
12

Code

這題打表過的,就不出了...

F.矩形

Description

在測試超大規模積體電路時,對給定的一個設計,專家要檢測元件是否相互遮蓋。一個元件可視為一個矩形,假設每個矩形都是水平排列的(邊與x軸或y軸平行),所以長方形由最小的和最大的x,y座標表示。
程式設計計算完全被覆蓋的矩形個數。

Input

輸入有多組長方形例項。對每組長方形,第一個數字是長方形的數量,然後是長方形的最小和最大x,y座標(最小x,最大x,最小y,最大y)。

Output

對每組輸入資料,輸出一行,是被完全覆蓋的長方形數量。

Sample Input

3
100 101 100 101
0 3 0 101
20 40 10 400
4
10 20 10 20
10 20 10 20
10 20 10 20
10 20 10 20

Sample Output

0
4

Code

#include <bits/stdc++.h>

using namespace std;

struct node
{
    int minx,maxx;
    int miny,maxy;
}s[10010];

int main()
{
    int n,ans,a[10010]={0};
    while(cin>>n)
    {
        ans=0;
        memset(a, 0, sizeof(a));
        for(int i=0;i<n;i++)
        {
            cin>>s[i].minx>>s[i].maxx>>s[i].miny>>s[i].maxy;
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(i==j)continue;
                if(!a[j] && s[i].minx <= s[j].minx && s[i].maxx >= s[j].maxx && s[i].miny <= s[j].miny && s[i].maxy >= s[j].maxy)
                {
                    ans++;
                    a[j]=1;
                }
                if(!a[i] && s[j].minx <= s[i].minx && s[j].maxx >= s[i].maxx && s[j].miny <= s[i].miny && s[j].maxy >= s[i].maxy)
                {
                    ans++;
                    a[i]=1;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

G.抽獎

Description

公司舉辦年會,為了活躍氣氛,設定了搖獎環節。參加聚會的每位員工都有一張帶有號碼的抽獎券。現在,主持人依次公佈 n 個不同的獲獎號碼,小謝看著自己抽獎券上的號碼 num,無比緊張。請編寫一個程式,如果小謝獲獎了,請輸出他中的是第幾個號碼;如果沒有中獎,請輸出 0。

Input

第一行一個正整數 n,表示有 n 個獲獎號碼,2&lt;n≤100。
第二行包含 n 個正整數,之間用一個空格隔開,表示依次公佈的 n 個獲獎號碼。
第三行一個正整數 num,表示小謝抽獎券上的號碼。
1≤獲獎號碼,num&lt;10000。

Output

一行一個整數,如果小謝中獎了,表示中獎的是第幾個號碼;如果沒有中獎,則為 0。

Sample Input

7
17 2 3 4 9555 6 1
3

Sample Output

3

Hint

暴力
單組輸入

Code

#include<bits/stdc++.h>

using namespace std;

int main()
{
	int n,num[110],lotto,flag=0;
	int i;
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>num[i];
	}
	cin >> lotto;
	for(i=0;i<n;i++)
	{
		if(num[i] == lotto)
		{
			cout<<i+1;
			break;
		}
	}
	if(i==n)    cout<<0;
	return 0;
}

H.比身高

Description

有 N 個人排成一排,假設他們的身高均為正整數,請找出其中符合以下條件的人:排在他前面且比他高的人數與排在他後面且比他高的人數相等。

Input

第一行為一個正整數 N,1&lt;N&lt;1000,表示有多少個人。
下面 N 行,每行一個正整數,表示從前往後每個人的身高,假設每個人的身高≤10000。

Output

一行一個整數,表示滿足這個條件的人數。

Sample Input

4
1
2
1
3

Sample Output

2

Hint

第 3、第 4 個人滿足條件。
單組輸入

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n,num[1010],l,r,ans=0;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>num[i];
	}
	for(int i=0;i<n;i++)
	{
		l=r=0;
		for(int j=i-1;j>=0;j--)
		{
			if(num[j]>num[i])	l++;
		}
		for(int j=i+1;j<n;j++)
		{
			if(num[j]>num[i])	r++;
		}
		if(l==r)	ans++;
	}
	cout<<ans;
	return 0;
}

I.樓層編號

Description

小林在 NOIP 比賽期間住在“新世界”酒店。和其他酒店不一樣的是,這個酒店每天都有一個高能的數字 t,這個數字在樓層中是不會出現的,以 t=3 為例,則 3、13、31、33 等樓層是不存在的,樓層編號為 1,2,4,5,…所以實際上的 4 樓才是 3 樓。
已知小林預訂了編號為 m 層的房間,並且當天高能數字是 t,現在他想知道房間所在的真實樓層是多少。

Input

一行兩個整數 m 和 t,1≤m≤100000,0≤t≤9,保證 m 對 t 合法。

Output

一行一個整數,表示真實樓層。

Sample Input

14 3

Sample Output

12

Hint

單組輸入

Code

#include <bits/stdc++.h>
using namespace std;

int t,b;

bool judge(int n)
{
    while(n>0)
    {
        b=n%10;
        n/=10;
        if(b==t)return 0;
    }
    return 1;
}

int main()
{
    int m;
    int now=0;
    cin >> m >> t;
    for(int i=1; i <= m; i++)
    {
        if(judge(i))	now++;
    }
    cout<<now;
    return 0;
}

J.比例簡化

Description

在社交媒體上,經常會看到針對某一個觀點同意與否的民意調查以及結果。例如,對某觀點表示支援的有 1498 人,反對的有 902 人,那麼其比例可以簡單地記為1498∶902。
因該比例的數值太大,難以一眼看出它們的關係。若把比例記為 5∶3,雖然與真實結果有一定的誤差,但依然能夠較為準確地反映調查結果,同時也顯得比較直觀。
現給出支援人數 A 和反對人數 B,以及一個上限 L,請將 A 比 B 化簡為 A′ 比 B′,要求在 A′和 B′ 均不大於 L,且 A′ 和 B′ 互質(兩個整數的最大公約數為 1)的前提下,A′/B′≥ A/B 且 A′/B′-A/B 的值儘可能小。

Input

一行三個整數 A,B,L,每兩個整數之間用一個空格隔開,分別表示支援人數、反對人數以及上限。

Output

一行兩個整數 A′ 和 B′,中間用一個空格隔開,表示化簡後的比例。

Sample Input

1498 902 10

Sample Output

5 3

Hint

單組輸入,1&lt;=A,B&lt;=1000000,1&lt;=L&lt;=100,A/B&lt;=L

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a,b,l,tmp,a1,a2,t;
    double fs,minnum=10000000,r;
    cin>>a>>b>>l;
    tmp=__gcd(a,b);
    a/=tmp;
    b/=tmp;
    r= (double)a / b;
    if(a<l&&b<l)cout<<a<<" "<<b;
    else
    {
        a1=a;
        a2=b;
        for(int i=1;i<=l;i++)
        {
            for(int j=1;j<=l;j++)
            {
                if(__gcd(i,j)!=1)continue;
                fs=(double)i/j;
                if(fs < r)continue;
                if(fabs(fs - r) < minnum)
                {
                    minnum=fabs(fs - r);
                    a1=i;
                    a2=j;
                }
            }
        }
        cout << a1 << " " << a2;
    }
    return 0;
}

K.奶牛碑文

Description

小偉暑假期間到大草原旅遊,在一塊石頭上發現了一些有趣的碑文。碑文似乎是一個神祕古老的語言,只包括三個大寫字母 C、O 和 W。儘管小偉看不懂,但是令他高興的是,C、O、W的順序形式構成了一句他最喜歡的奶牛單詞“COW”。現在,他想知道有多少次 COW 出現在文字中。
如果 COW 內穿插了其他字元,只要 COW 字元出現在正確的順序,小偉也不介意。甚至,他也不介意出現不同的 COW 共享一些字母。例如,CWOW 出現了 1 次 COW,CCOW 算出現了2 次 COW,CCOOWW 算出現了 8 次 COW。

Input

第 1 行為 1 個整數 N。
第 2 行為 N 個字元的字串,每個字元是一個 C、O 或 W。

Output

輸出 COW 作為輸入字串的字串出現的次數(不一定是連續的)。
提示:答案會很大,建議用 64 位整數(long long)。

Sample Input

6
COOWWW

Sample Output

6

Hint

對於 50% 的資料滿足:N≤60。
對於 100% 的資料滿足:N≤100000。
單組輸入

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    long long c=0,co=0,cow=0;
    string s;
    cin >> n >> s;
    for(int i=0;i<n;i++)
    {
        if(s[i] == 'C')c++;
        if(s[i] == 'O')co+=c;
        if(s[i] == 'W')cow+=co;
    }
    cout<<cow<<endl;
    return 0;
}