1、 [編程題] 買帽子
時間限制:1秒
空間限制:32768K 度度熊想去商場買一頂帽子,商場裡有N頂帽子,有些帽子的價格可能相同。度度熊想買一頂價格第三便宜的帽子,問第三便宜的帽子價格是多少。
輸入描述:
首先輸入一個正整數N(N <= 50),接下來輸入N個數表示每頂帽子的價格(價格均是正整數,且小於等於1000)
輸出描述:
如果存在第三便宜的帽子,請輸出這個價格是多少,否則輸出-1
輸入例子:
1010 10 10 10 20 20 30 30 40 40
輸出例子:
30
分析:壓縮數組,用新數組儲存,判斷新數組長度是否大於等於3即可
AC代碼如下:
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;const int maxn=50+1;int a[maxn],b[maxn];int main(){ int n,num=0; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); for(int i=0;i<n;i++) { b[num]=a[i]; while(i+1<n && b[num]==a[i+1]) { i++; } num++; } if(num>=3) cout<<b[2]<<endl; else cout<<-1<<endl; return 0;}
2、 [編程題] 度度熊回家
時間限制:1秒
空間限制:32768K 一個數軸上共有N個點,第一個點的座標是度度熊現在位置,第N-1個點是度度熊的家。現在他需要依次的從0號座標走到N-1號座標。 但是除了0號座標和N-1號座標,他可以在其餘的N-2個座標中選出一個點,並直接將這個點忽略掉,問度度熊回家至少走多少距離。 輸入描述:
輸入一個正整數N, N <= 50。接下來N個整數表示座標,正數表示X軸的正方向,負數表示X軸的負方向。絕對值小於等於100
輸出描述:
輸出一個整數表示度度熊最少需要走的距離。
輸入例子:
41 4 -1 3
輸出例子:
4
分析:枚舉忽略的點,並標記,用新數組存起來再做相應的操作
AC代碼如下:
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;const int maxn=50+1;int fun(int s[],int t[],int n){ int sum=0,num=0; int c[maxn]; for(int i=0;i<n;i++) { if(!t[i]){ c[num]=s[i]; num++; } } for(int i=1;i<num;i++) { sum+=abs(c[i]-c[i-1]); } return sum;}int main(){ int a[maxn]; int b[maxn]; int n,mini=999999; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; memset(b,0,sizeof(b)); for(int i=1;i<n-1;i++) { b[i]=1; mini=min(mini,fun(a,b,n)); b[i]=0; } cout<<mini<<endl; return 0;}
3、 [編程題] 尋找三角形
時間限制:1秒
空間限制:32768K 三維空間中有N個點,每個點可能是三種顏色的其中之一,三種顏色分別是紅綠藍,分別用'R', 'G', 'B'表示。
現在要找出三個點,並組成一個三角形,使得這個三角形的面積最大。
但是三角形必須滿足:三個點的顏色要麼全部相同,要麼全部不同。
輸入描述:
首先輸入一個正整數N三維座標系內的點的個數.(N <= 50) 接下來N行,每一行輸入 c x y z,c為'R', 'G', 'B' 的其中一個。x,y,z是該點的座標。(座標均是0到999之間的整數)
輸出描述:
輸出一個數表示最大的三角形面積,保留5位小數。
輸入例子:
5R 0 0 0R 0 4 0R 0 0 3G 92 14 7G 12 16 8
輸出例子:
6.00000
分析:因為要判斷多個條件,所以分別寫函數實現,求面積用海倫公式
AC代碼如下:
#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>using namespace std;const int maxn=50+1;struct point{ char color; int x; int y; int z;}po[maxn];double juli(point a,point b){ double sum; sum=sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z) ); return sum;}double area(double a,double b,double c) //求面積{ double p=(a+b+c)/2.0; double s=sqrt(p*(p-a)*(p-b)*(p-c)); return s;}bool iscolor(point a,point b,point c) //判斷顏色{ if(a.color==b.color && b.color==c.color && a.color==c.color) return true; if(a.color!=b.color && b.color!=c.color && a.color!=c.color) return true; return false;}double isk(point a,point b,point c) //是否是三角形{ double kx,ky,kz; kx=juli(a,b); ky=juli(a,c); kz=juli(b,c); if(kx<ky+kz && ky<kx+kz && kz<ky+kx) return true; return false;}int main(){ int n; double maxn=-1.0; cin>>n; for(int i=0;i<n;i++) { cin>>po[i].color>>po[i].x>>po[i].y>>po[i].z; } for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) { if(i!=j && j!=k && i!=k) { if(iscolor(po[i],po[j],po[k])) { if( isk(po[i],po[j],po[k]) ) { maxn=max( maxn,area( juli(po[i],po[j]),juli(po[i],po[k]),juli(po[j],po[k]) ) ); } } } } printf("%.5lf\n",maxn); return 0;}
4、 [編程題] 有趣的排序
時間限制:1秒
空間限制:32768K 度度熊有一個N個數的數組,他想將數組從大到小排好序,但是萌萌的度度熊只會下面這個操作:
任取數組中的一個數然後將它放置在數組的最後一個位置。
問最少操作多少次可以使得數組從小到大有序。
輸入描述:
首先輸入一個正整數N,接下來的一行輸入N個整數。(N <= 50, 每個數的絕對值小於等於1000)
輸出描述:
輸出一個整數表示最少的操作次數。
輸入例子:
419 7 8 25
輸出例子:
2
分析:用原序列與排序(從小到大)後的序列比較,從頭到尾,看有多少元素已經相對排序好了,即不需要移動,剩下的即為需要移動的
AC代碼如下:
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn=50+1;int a[maxn],sorta[maxn];int main(){ int n; int count=0; cin>>n; for(int i=0;i<n;i++){ cin>>sorta[i]; a[i]=sorta[i]; } sort(sorta,sorta+n); for(int i=0,j=0;i<n;i++) { if(a[i]==sorta[j]) { count++; j++; } } cout<<n-count<<endl; return 0;}
5、 [編程題] 不等式數列
時間限制:1秒
空間限制:32768K 度度熊最近對全排列特別感興趣,對於1到n的一個排列,度度熊發現可以在中間根據大小關係插入合適的大於和小於符號(即 '>' 和 '<' )使其成為一個合法的不等式數列。但是現在度度熊手中只有k個小於符號即('<'')和n-k-1個大於符號(即'>'),度度熊想知道對於1至n任意的排列中有多少個排列可以使用這些符號使其為合法的不等式數列。
輸入描述:
輸入包括一行,包含兩個整數n和k(k < n ≤ 1000)
輸出描述:
輸出滿足條件的排列數,答案對2017模數。
輸入例子:
5 2
輸出例子:
66
分析:博主能力太弱此題不會啊,應該要用動態規劃