?1.害死人不償命的(3n+1)算法
卡拉茲( Calatz)猜想:
對任何一個自然數n,如果它是偶數,那么把它砍掉一半;如果它是奇數,那么把(3n+1)砍掉一半。這樣一直反復砍下去,最后一定在某一步得到n=1。卡拉茲在1950年的世界數學家大會上公布了這個猜想,傳說當時耶魯大學師生齊動員,拼命想證明這個貌似很荒唐......
此處并非要證明卡拉茲猜想,而是對給定的任一不超過1000的正整數n,簡單地數一下,需要多少步才能得到n=1?
輸入格式
每個測試輸入包含1個測試用例,即給出自然數n的值。
輸出格式
輸出從n計算到1需要的步數。
輸入樣例
3
輸出樣例
5
#include<stdio.h>
int main() {int a,nut=0;scanf_s("%d",&a);while (a != 1) {if (a % 2 == 0) {a = a / 2;}else {a = 3 * a + 1;a = a / 2;}nut++;}printf("%d", nut);return 0;
}
?2.挖掘機技術哪家強
題目描述:
為了用事實說明挖掘機技術到底哪家強,PAT 組織了一場挖掘機技能大賽。現請你根據比賽結果統計出技術最強的那個學校。
輸入格式:
輸入在第 1 行給出不超過 10 ?5 的正整數 N,即參賽人數。隨后 N 行,每行給出一位參賽者的信息和成績,包括其所代表的學校的編號(從 1 開始連續編號)、及其比賽成績(百分制),中間以空格分隔。
輸出格式:
在一行中給出總得分最高的學校的編號、及其總分,中間以空格分隔。題目保證答案唯一,沒有并列。
?
輸入樣例:
6
3 65
2 80
1 100
2 70
3 40
3 0
?
輸出樣例:
2 150
?
#include<stdio.h>
int main() {int n, a, b, arr[100001]={0}, max = 0, number;scanf_s("%d", &n);for (int i = 0; i < n; i++) {scanf_s("%d %d", &a, &b);arr[a] = arr[a]+b;if(max<arr[a]){max = arr[a];number = a;}}printf("%d %d", number,max );return 0;
}
?
?
?3.選擇排序
#include<stdio.h>
#include<malloc.h>
int main() {int n;scanf_s("%d", &n);int *arr = (int*)malloc(sizeof(int) * n);for (int i = 0; i < n; i++) {scanf_s("%d", &arr[i]);}int num, number = -1;scanf_s("%d", &num);for (int i = 0; i < n; i++) {if (arr[i] == num) {number = i;break;}}printf("%d\n", number);free(arr);return 0;
}
?
?4.貪心算法
貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是全局最好或最優的算法。貪心算法解決問題的過程中,它對每個子問題的解決方案都做出選擇,不能回退。貪心算法通常用來解決那些最優化問題,如最小生成樹、霍夫曼編碼等。
此處處理:
有一堆寶石,他們的價值相同,但是重量不同,你只有一臺有限容量的小推車,要獲得最大利益(帶走盡可能多的寶石)是多少?(即這次帶走多少寶石)
#include<stdio.h>
int swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}
int main() {int min;int arr[] = { 1,3,5,2,4 };int len = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < len - 1; i++) {int min = i;for (int j = i + 1; j < len; j++) {if (arr[j] < arr[i]) {min = j;}}swap(&arr[min], &arr[i]);}for (int i = 0; i < len; i++) {printf("%d ", arr[i]);}return 0;
}