1. 程式人生 > >CCF認證試題 及答案

CCF認證試題 及答案

問題描述 
試題編號: 201312-1 試題名稱: 出現次數最多的數 時間限制: 1.0s 記憶體限制: 
256.0MB 
問題描述: 
  給定n個正整數,找出它們中出現次數最多的數。如果這樣的數有多個,請輸出其中最小的一個。 

輸入格式 
  輸入的第一行只有一個正整數n(1 ≤ n ≤ 1000),表示數字的個數。   輸入的第二行有n個整數s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相鄰的數用空格分隔。 輸出格式 
  輸出這n個次數中出現次數最多的數。如果這樣的數有多個,輸出其中最小的一個。 樣例輸入 

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 0 12 12 8 0 
樣例輸出 

樣例說明 
  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;
}