CCF認證試題 及答案
問題描述
試題編號: 201312-1 試題名稱: 出現次數最多的數 時間限制: 1.0s 記憶體限制:
256.0MB
問題描述:
給定n個正整數,找出它們中出現次數最多的數。如果這樣的數有多個,請輸出其中最小的一個。
輸入格式
輸入的第一行只有一個正整數n(1 ≤ n ≤ 1000),表示數字的個數。 輸入的第二行有n個整數s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相鄰的數用空格分隔。 輸出格式
輸出這n個次數中出現次數最多的數。如果這樣的數有多個,輸出其中最小的一個。 樣例輸入
6
10 1 10 20 30 20
樣例輸出
10
#include<stdio.h> #include<stdlib.h> struct In{ int a,b; }s[1005]; int cmp(const void*a,const void*b){ struct In*c=(In*)a; struct In*d=(In*)b; if(c->b!=d->b) return d->b - c->b; else return c->a -d->a; } int main(){ while(1){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&s[i].a); s[i].b=1; } for(int i=0;i<n-1;i++){ if(s[i].b) for(int j=i+1;j<n;j++){ if(s[i].a==s[j].a) s[i].b++,s[j].b=0; } } qsort(s,n,sizeof(s[0]),cmp); printf("%d\n",s[0].a); } return 0; }
201403-2
題目2 視窗
時間限制:1秒空間限制:256MB
問題描述
在某圖形作業系統中,有N個視窗,每個視窗都是一個兩邊與座標軸分別平行的矩形區域。視窗的邊界上的點也屬於該視窗。視窗之間有層次的區別,在多於一個視窗重疊的區域裡,只會顯示位於頂層的窗口裡的內容。
當你點選螢幕上一個點的時候,你就選擇了處於被點選位置的最頂層視窗,並且這個視窗就會被移到所有視窗的最頂層,而剩餘的視窗的層次順序不變。如果你點選的位置不屬於任何視窗,則系統會忽略你這次點選。
現在我們希望你寫一個程式模擬點選視窗的過程。
輸入格式
輸入的第一行有兩個正整數,即N和M。(1≤N≤10,1≤M≤10)接下來N行按照從最下層到最頂層的順序給出N個視窗的位置。每行包含四個非負整數x1,y1,x2,y2,表示該視窗的一對頂點座標分別為(x1,y1)和(x2,y2)。保證x1<x2,y1<y2。
接下來M行每行包含兩個非負整數x,y,表示一次滑鼠點選的座標。題目中涉及到的所有點和矩形的頂點的x,y座標分別不超過2559和1439。
輸出格式
輸出包括M行,每一行表示一次滑鼠點選的結果。如果該次滑鼠點選選擇了一個視窗,則輸出這個視窗的編號(視窗按照輸入中的順序從1編號到N);如果沒有,則輸出"IGNORED"(不含雙引號)。
輸入樣例
34
0044
2
輸出樣例
211
IGNORED
對樣例的解釋
第一次點選的位置同時屬於第1和第2個視窗,但是由於第2個視窗在上面,它被選擇並且被置於頂層。
第二次點選的位置只屬於第1個視窗,因此該次點選選擇了此視窗並將其置於頂層。現在的三個視窗的層次關係與初始狀態恰好相反了。第三次點選的位置同時屬於三個視窗的範圍,但是由於現在第1個視窗處於頂層,它被選擇。
最後點選的(0,5)不屬於任何視窗。
數列分段#include<stdio.h> struct In{ int up,down; int left,right; int ans; }a[15]; struct Im{ int x,y; }b[15]; int n,m; void sort1(int j){ for(;j<n;j++){ a[0]=a[j]; a[j]=a[j+1];a[j+1]=a[0]; } } int main(){ int x,y; printf("enter the 'N' 'M',enter the N line,M line\n"); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d%d%d%d",&a[i].left,&a[i].down,&a[i].right,&a[i].up); a[i].ans=i; } for(int i=1;i<=m;i++) scanf("%d%d",&b[i].x,&b[i].y); int i=1; printf("%d %d\n",b[i].x,b[i].y); for(int i=1;i<=m;i++){ int p=0;//biaoji for(int j=n;j>=1;j--){ if(b[i].x>=a[j].left&&b[i].x<=a[j].right &&b[i].y>=a[j].down&&b[i].y<=a[j].up){ printf("%d\n",a[j].ans); p=1; if(j!=n) sort1(j);//若用連結串列不需排序,只把此值連線在尾部 break; } } if(!p) printf("INGORED\n"); } return 0; }
試題編號: 201509-1 試題名稱: 數列分段 時間限制: 1.0s 記憶體限制:
256.0MB
問題描述:
問題描述
給定一個整數數列,數列中連續相同的最長整數序列算成一段,問數列中共有多少段? 輸入格式
輸入的第一行包含一個整數n,表示數列中整數的個數。
第二行包含n個整數a1, a2, …, an,表示給定的數列,相鄰的整數之間用一個空格分隔。 輸出格式
輸出一個整數,表示給定的數列有多個段。 樣例輸入
8
8 8 8 0 12 12 8 0
樣例輸出
5
樣例說明
8 8 8是第一段,0是第二段,12 12是第三段,倒數第二個整數8是第四段,最後一個0是第五段。 評測用例規模與約定
1 ≤ n ≤ 1000,0 ≤ ai ≤ 1000。
#include<stdio.h>
int main(){
int a[1005],ans=1,n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++){
if(a[i]!=a[i+1]) ans++;
}
printf("%d\n",ans);
return 0;
}