C語言演算法競賽入門(二)—陣列元素移動、排序問題、猴子選大王問題

空城機發表於2018-12-08

陣列元素移動

【問題描述】調整輸入陣列A[0..n],將其分為兩部分,左邊所有元素為奇數,右邊所有元素為偶數
【輸入形式】a0,b1,b2,a1,a2,b3,a3,a4
【輸出形式】a0,a1,a2,a3,a4,b1,b2,b3
【樣例輸入】1,2,33,8,5
【樣例輸出】1,33,5,2,8

程式碼:

#include<stdio.h>

int main()
{
	int a[100];
	int n=100,i,j,count=1,m;
	for(i=0;i<n;i++)   //迴圈輸入陣列資料
	{
		scanf("%d",&a[i]);
		char c=getchar();//getchar函式,從鍵盤的緩衝區中得到一個字元常量並賦值給c
		if(c==`
`)   //當鍵盤輸入回車時結束輸入輸入
		{
            break;
		}
		count++;
	}
	scanf("%d",&m);
	for(i=0;i<=count;i++)
	{	
		for(j=i+1;j<=count;j++)
		{
			if(m==(a[i]+a[j]))
			{
				printf("%d %d",a[i],a[j]);
				i=count+1; break;
			}
		}		
	}
	printf("
");
	return 0;
}

 

排序問題

【問題描述】

輸入一個已經按升序排序過的陣列和一個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是O(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。
【輸入形式】

一個升序排序的陣列以空格隔開,以及一個目標數字,換行輸入
【輸出形式】

如果存在陣列中兩個數字和為目標數字,則輸出數字對;

如果存在多個滿足條件的數字對,輸入一對即可;

不存在則不輸出;
【樣例輸入】

1 2 4 7 11 15

15

【樣例輸出】

4 11
【樣例說明】

4+11=15
【評分標準】

時間複雜度必須為 O(n),否則酌情給分。

#include<stdio.h>
int main()
{
    int a[100],b[100],c[100];
    int i,count=0,j=0,k=0;
	char s;
	for(i=0;i<100;i++)
	{
		scanf("%d",&a[i]);
		char c=getchar();
		if(c==`
`)
		break;
		scanf("%c",&s);
		count++;
	}
	for(i=0;i<=count;i++)
	{
		if(a[i]%2==1||a[i]%2==-1)
		{
			b[j]=a[i];
			j++;
		}
		if(a[i]%2==0)
		{
			c[k]=a[i];
			k++;
		}		
	}
	printf("%d",b[0]);
	for(i=0;i<j;i++)
		printf(",%d",b[i]);
	for(i=0;i<k;i++)
		printf(",%d",c[i]);
	printf("
");
    return 0;
}

猴子選大王問題

【問題描述】

N只猴子選大王,選舉方法如下:所有猴子按1,2,3,&hellip; ,N編號圍坐一圈,從第1個猴子開始報數,報到M號退出圈外,如此迴圈報數,直到圈內只剩下一個猴子,即為大王。程式設計輸出大王的原始序號。N和M的值由鍵盤輸入。如果你想成為剩下的那一個,在N一定的情況下,你應該站在什麼位置上?程式設計實現位置的求解。
【輸入形式】

輸入兩個數字N和M,N為猴子的個數,M為報到後退出圈外的數字。
【輸出形式】

顯示最後剩下的猴子的原始序號。

【樣例輸入】

5 3
【樣例輸出】

4
【樣例說明】

共5個猴子圍成一圈,報到3號退出圈外,最後留下的猴子的原始編號為4
【評分標準】

當輸入的M,N不合法時應當給出錯誤提示&ldquo;請輸入合法的M,N值!&rdquo;。

#include<stdio.h>

int main()
{
	int n,m;
	int last = 0;
	scanf("%d %d",&m,&n);
	
    if(n<1 || m<1 ) 
	{
		printf("請輸入合法的M,N值!
");
	}else{		
		for (int i=2;i<=m;i++)
		{
			last = (last+n)%i;
		}
		printf("%d
",last+1);
	}
    return 0;
}

 


相關文章