ACM-NEFU-2020大一寒假培訓三(暴力)
阿新 • • 發佈:2020-12-24
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>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 < n < 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<=m<=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<n≤100。
第二行包含 n 個正整數,之間用一個空格隔開,表示依次公佈的 n 個獲獎號碼。
第三行一個正整數 num,表示小謝抽獎券上的號碼。
1≤獲獎號碼,num<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<N<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<=A,B<=1000000,1<=L<=100,A/B<=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;
}