1. 程式人生 > >安徽科技學院2016-2017-1學期2013資訊與計算科學12班期末測試_題解

安徽科技學院2016-2017-1學期2013資訊與計算科學12班期末測試_題解

2016-2017-1學期2013資訊與計算科學12班<演算法分析與設計>期末測試

Problem ID Title Source
1183 Problem A 公約數和公倍數 基礎
1268 Problem B 逆反A*B [email protected]
1426 Problem C 子串和 NYOJ
1264 Problem D 圖書館佔位 [email protected]
1527 Problem E 快看,有人撿到錢了!!! wwy
1528 Problem F 螞蟻 nyoj
1529 Problem G 尋找最大數 nyoj改編
1530 Problem H 神童的煩惱 nyoj改編
1531 Problem I Grasshopper Codeforces改編

Problem A 公約數和公倍數

Description

小明被一個問題給難住了,現在需要你幫幫忙。問題是:給出兩個整數,求出它們的最大公約數和最小公倍數。

Input

第一行輸入一個大於0的整數n(n<=20),示有n組測試資料隨後的n行輸入兩個整數i,j(i,j小於32767)。

Output

輸出每組測試資料的最大公約數和最小公倍數

Sample Input

3
6 6
12 11
33 22

Sample Output

6 6
1 132
11 66

題解:這道題屬於簡單題,下面直接給出程式碼

#include <stdio.h>
int gcd(int a, int b)
{
    return b ? gcd(b, a%b) : a;
}
int main()
{
    int t, a, b;
    scanf("%d", &t);
    while (t--)
    {
        scanf
("%d%d", &a, &b); printf("%d %d\n", gcd(a, b), a*b/gcd(a, b)); } return 0; }

Problem B 逆反A*B

Description

給定A B計算A*B的結果C,不過這裡面都要反過來啦!
舉例:52*52=526 因為52表示25(逆反數)25*25=652,
A B 不超過10000

Input

輸入A,B

Output

計算A B的逆反數的積的逆反數C

Sample Input

52 52
30 30
1 1 

Sample Output

526
9
1

題解:這道題也是道簡單題,詳見程式碼,關鍵寫一個逆反數的轉換函式即可

#include <stdio.h>
int f(int n,int a)
{
    return n?f(n/10,a*10+n%10):a;
}
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
        printf("%d\n",f(f(a,0)*f(b,0),0));
    return 0;
}

Problem C 子串和

Description

給定一整型數列{a1,a2…,an},找出連續非空子串{ax,ax+1,…,ay},使得該子序列的和最大,其中,1<=x<=y<=n。

Input

第一行是一個整數N(N<=10)表示測試資料的組數)
每組測試資料的第一行是一個整數n表示序列中共有n個整數,隨後的一行裡有n個整數I(-100=

Output

對於每組測試資料輸出和最大的連續子串的和。

Sample Input

1
5
1 2 -1 3 -2

Sample Output

5

Hint

輸入資料很多,推薦使用scanf進行輸入

題解:經典演算法,對數列進行一次掃描並求和,儲存其thisSum,並更新最大和maxSum,若是當前和thisSum<0,則置thisSum=0從當前位置開始累加,因為負數加上一個數肯定是會變小的,最終的maxSum就是最大值

#include <stdio.h>  
int main()  
{  
    int T, n, x;
    scanf("%d", &T);
    while(T--)
    {
        int thisSum=0, maxSum=0;
        scanf("%d", &n);
        for(int i=0; i<n; i++)  
        {  
            scanf("%d", &x);  
            thisSum += x;
            if(thisSum > maxSum)  
                maxSum = thisSum;  
            if(thisSum < 0)  
                thisSum = 0;
        }  
        printf("%d\n", maxSum);  
    }  
    return 0;  
}  
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int t = cin.nextInt();
        while (t-- > 0) {
            int n = cin.nextInt();
            int maxSum = 0, thisSum = 0;
            for (int i=0; i<n; i++) {
                int data = cin.nextInt();
                thisSum += data;
                if (thisSum > maxSum)
                    maxSum = thisSum;
                if (thisSum < 0)
                    thisSum = 0;
            }
            System.out.println(maxSum);
        }
        cin.close();
    }
}

Problem D 圖書館佔位

Description

圖書館佔位的很厲害,只要去晚了一會就沒有位置了。有些人佔著位置卻不來自習,這就造成了資源的浪費。現在我們的問題是一天當中有n個同學可能會來到同一個座位,假設上面有人則另外找座位,若沒有人,則就可以佔據此位置,直至你離開為止。為了最大化利用圖書館資源,我們要求的問題是一個位置最多能夠被幾個同學來用過。

Input

多組測試資料
第一行為n個同學 (1 <=n<=10000)
接下來n行就是每個同學的進入圖書館的時間和離開圖書館的時間,為了簡化問題,我們假設時間值為整數。

Output

輸出一個座位最多被幾位同學佔據。

Sample Input

6
1 3
2 4
3 6
7 9
5 7
10 11

Sample Output

4

題解:此題用貪心法求解,首先對所有同學離開圖書館的先後進行排序,然後對此序列進行遍歷,只要離開圖書館的時間小於第二個同學進入圖書館的時間,這個位置可坐人數+1,遍歷完畢也即得到此位置最多可以容納的人數

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct A {
    int start, end;

    bool operator<(const A &a) const {
        return this->end < a.end;
    }
};

int main() {
    for (int n; cin >> n;) {
        vector<A> v(n);
        for (int i = 0; i < n; i++)
            cin >> v[i].start >> v[i].end;
        sort(v.begin(), v.end());
        int tot = 0, start = 0;
        for (vector<A>::iterator it = v.begin(); it != v.end(); ++it) {
            if (it->start >= start) {
                ++tot;
                start = it->end;
            }
        }
        cout << tot << endl;
    }
    return 0;
}

Problem E 快看,有人撿到錢了!!!

Description

老趙喜歡吃燒烤,在一次和同學們吃完燒烤回來的路上,老趙一不小心撿了一百塊,同學們強烈要求老趙買蛋糕慶祝,老趙爽快的扔了兩百給蛋糕店,讓他們做一個球形的大蛋糕。現在老趙拿起了刀叉準備和同學們瓜分這個蛋糕,一刀下去蛋糕成了兩塊,然後n個同學每人都來一刀。
現在老趙問同學們,n個人切完以後蛋糕最多有多少塊。(能ac的送thinkpaid)。

Input

多組輸入,每行一個整數n,n個同學

Output

對於每個整數n,輸出一個整數s(n個人切完蛋糕最多有s塊)

Sample Input

1
2

Sample Output

4
8

題解:這道題有一定難度,此題屬於平面分割空間問題,需要運用遞推關係,具體請查閱相關資料。
公式是f(n)=(n^3+5n)/6+1

#include <stdio.h>
#include <math.h>

int main()
{
    int n;
    while (~scanf("%d",&n)) {
        n++;
        printf("%d\n", (n*n*n+5*n)/6+1);
    }
    return 0;
}

Problem F 螞蟻

Description

n只螞蟻義每秒1cm的速度在長為Lcm的杆子上爬行。當螞蟻爬到杆子的端點就會掉下去。由於杆子太細,兩隻螞蟻相遇時,他們不能交錯通過,只能各反向回去。對於每隻螞蟻,我們知道它距離杆子左端的距離xi,但不知道它當時的朝向,計算所有螞蟻落下杆子的最短時間和最長時間。
1<=L<=10^6
1<=n<=10^6;
0<=xi<=L;

Input

多組輸入,第一行L和n,接下來n個xi(L為杆子的長度,n只螞蟻,及每隻螞蟻距離杆子左端的距離xi)

Output

輸出螞蟻落下杆子的最短時間和最長時間

Sample Input

10 3
2 6 7

Sample Output

4 8

題解:這道題只要考慮清楚後其實也很好解,不需要考慮掉頭情況,因為螞蟻速度一樣,即是說螞蟻掉頭對此題不產生影響。也可以這樣理解,在遠處觀察這些螞蟻的運動,一群螞蟻運動時,因為速度是一樣的,所以當螞蟻碰撞而掉頭時,看上去和兩個點“對穿而過”沒有任何區別,這樣,不論最長時間還是最短時間,都只要對每隻螞蟻檢查一次就好了,這是O(n)時間的演算法。於是問題得解。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
    int L, n, minT, maxT, a;
    while (~scanf("%d%d", &L, &n))
    {
        minT = 0; maxT = 0;
        for (int i=0; i<n; i++) {
            scanf("%d", &a);
            minT = max(minT, min(a, L-a));
            maxT = max(maxT, max(a, L-a));
        }
        printf("%d %d\n", minT, maxT);
    }
    return 0;
}

Problem G 尋找最大數

Description

給出一個整數n每次可以移動相鄰數位上的數字,最多移動k次,得到一個新的整數,求這個新的整數的最大值是多少。

Input

多組測試資料。
每組測試資料佔一行,每行有兩個數N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).

Output

每組測試資料的輸出佔一行,輸出移動後得到的新的整數的最大值。

Sample Input

1990 1
100 0
9090000078001234 6

Sample Output

9190
100
9907000008001234

題解:一個數交換每次相鄰兩位數,因為高位數字越大數字結果就越大。可以交換k次,所以可以依次在當前位置到當前的第k位找到最大數並交換到當前位置,每交換一次k–
重複上述步驟,直到k=0結束,這樣得到數字也即使最大數

#include <stdio.h>
#include <string.h>
char a[100], max;
int k, i, j, index;

void solve()
{
    int len = strlen(a);
    for (i=0; i<len && k; i++) {
        index = i; max = a[i];
        for (j=i+1; j<len && j<=i+k; j++) {
            if (max < a[j]) {
                index = j;
                max = a[j];
            }
        }
        for (j=index; j>i; j--) {
            a[j] = a[j-1];
            k--;
        }
        a[i] = max;
    }
    puts(a);
}

int main()
{
    while (~scanf("%s %d", a, &k))
    {
        solve();
    }
    return 0;
}

Problem H 神童的煩惱

Description

數學神童小明終於把0到100000000的Fibonacci數列(f[0]=0,f[1]=1;f[i] = f[i-1]+f=2”>i-2)的值全部給背了下來。
接下來,CodeStar決定要考考他,於是每問他一個數字,他就要把答案說出來,不過有的數字太長了。所以規定超過4位的只要說出前4位(高4位)就可以了,可是CodeStar自己又記不住。於是他決定編寫一個程式來測驗小明說的是否正確。

Input

輸入若干數字n(0 <= n <= 100000000),每個數字一行。讀到檔案尾結束。

Output

輸出f[n]的前4個數字(若不足4個數字,就全部輸出)。

Sample Input

0
1
2
3
4
5
35
36
37
38
39
40

Sample Output

0
1
1
2
3
5
9227
1493
2415
3908
6324
1023

題解:這道題需要用到斐波那契數列的通項公式
斐波拉契數列通項公式
log10f(n)=n*log10((1+√5)/2)-log10√5+log10(1-((1-√5)/(1+√5))n) 後一部分隨著n的增大快速的就趨近餘0,是高階無窮小. 可以忽略。所以有log10f(n) ≈n*log10((1+√5)/2)-log10√5
此題要求斐波拉契前4位,由此可以得出pow(10,log10f(n)+3-整數部分),在對其取整即為結果。需要注意的是斐波拉契前較小項因為浮點誤差所以應該事先求出

#include <stdio.h>
int main()
{
    int n, i;
    int fib[21]={0, 1};
    for (i=2; i<=20; i++)
        fib[i] = fib[i-1]+fib[i-2];

    while (~scanf("%d", &n))
    {
        if (n <= 20)
            printf("%d\n", fib[n]);
        else {
            double f=n*log10((sqrt(5)+1)*.5)-log10(sqrt(5));
            f = f+3-floor(f);
            printf("%d\n", (int)pow(10, f));
        }
    }
    return 0;
}

Problem I Grasshopper

Description

One day, the Grasshopper was jumping on the lawn and found a piece of paper with a string. Grasshopper became interested what is the minimum jump ability he should have in order to be able to reach the far end of the string, jumping only on vowels of the English alphabet. Jump ability is the maximum possible length of his jump.

Formally, consider that at the begginning the Grasshopper is located directly in front of the leftmost character of the string. His goal is to reach the position right after the rightmost character of the string. In one jump the Grasshopper could jump to the right any distance from 1 to the value of his jump ability.

演算法設計與分析Grasshopper

The picture corresponds to the first example.

The following letters are vowels: ‘A’, ‘E’, ‘I’, ‘O’, ‘U’ and ‘Y’.

Input

Input contains multiple test cases.The first line contains non-empty string consisting of capital English letters. It is guaranteed that the length of the string does not exceed 100.

Output

Print single integer a — the minimum jump ability of the Grasshopper (in the number of symbols) that is needed to overcome the given string, jumping only on vowels.

Sample Input

ABABBBACFEYUKOTT
AAA

Sample Output

4
1

題解:這道題是比較容易的一道題,主要是英語題於是大家都沒有做了,思路很簡單,找到一個序列中跨越母音字母(’A’, ‘E’, ‘I’, ‘O’, ‘U’, ‘Y’)的最大長度,看圖例就能很好明白,直接給出程式碼

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

bool is(char c)
{
    char a[6] = {'A', 'E', 'I', 'O', 'U', 'Y'};
    for (int i=0; i<6; i++)
        if (a[i] == c)
            return true;
    return false;
}

int main()
{
    char s[1000];
    while (~scanf("%s", s))
    {
        int m = 1, mx = 0;
        for (int i=0; i<strlen(s); i++) {
            if (is(s[i])) {
                m = 1;
            }else m++;
            if (mx < m)
                mx = m;
        }
        printf("%d\n", mx);
    }
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        while (cin.hasNext()) {
            char[] a = cin.next().toCharArray();
            int len = 1, max = 1;
            for (int i=0; i<a.length; i++) {
                if (f(a[i])) {
                    len = 1;
                }else
                    len++;
                if (len > max)
                    max = len;
            }
            System.out.println(max);
        }
        cin.close();
    }

    private static boolean f(char c) {
        char a[] = {'A', 'E', 'I', 'O', 'U', 'Y'};
        for (int i=0; i<a.length; i++)
            if (a[i] == c)
                return true;
        return false;
    }
}

相關推薦

安徽科技學院2016-2017-1學期2013資訊計算科學12期末測試_題解

2016-2017-1學期2013資訊與計算科學12班<演算法分析與設計>期末測試 Problem ID Title Source 1183 Problem A 公約數和公倍數 基礎 1268

2016-2017-1 20155215 信息安全技術 補課上測試

debug 序列 tube which amp 什麽是 proc shell 漏洞 2016-2017-1 20155215 信息安全技術 補課上測試 因為沒有及時提交課上的測試成績,所以我在課後做了一些關於惡意代碼的學習,作為一個補充提交項。 惡意代碼分析技術。

2016-2017-1(實變函數56, 點集拓撲56)

數學1 應用數學 spa style -s 應用 pan 4.2 size 2016-2017-1(實變函數56, 點集拓撲56) 實變函數 (數學與應用數學1401, 數學與應用數學1402) [1-14周一(1,2) 7-205,周二(1,2) 7-206] {94.

“青軟杯”安徽科技學院第六屆程式設計大賽_非專業組

1299 Problem C C互質個數 C互質個數 Time Limit:1000MS  Memory Limit:65536K Total Submit:21 Accepted:8 Description 貝貝、妞妞和康康都長大了,如今,他們已屆小學畢業,老師給貝貝出了一道強化計算的題目,讓她做一大堆除

20162317 2016-2017-2《程序設計數據結構》課程總結

最小 第二周作業 教學 課程總結 能夠 語言 平時 remove 邏輯 20162317 2016-2017-2《程序設計與數據結構》課程總結 總目錄 每周作業鏈接匯總 實驗報告鏈接匯總 團隊項目報告鏈接匯總 代碼托管鏈接 課堂項目實踐或課後作業 課堂的收獲和不足 問

20162313 2016-2017-2《程序設計數據結構》課程總結

教學 好處 數據庫設計 哈希算法 ref 托管 tps 明顯 討論 20162313 2016-2017-2《程序設計與數據結構》課程總結 每周作業鏈接匯總 第一周作業 算法與增長函數 第三周作業 查找與排序 第五周作業 集合,繼承,多態,泛型 第七周作業 樹與二叉樹等的相

惠州學院-資料庫實驗1-資料庫模式設計建立

    計算機科學系實驗報告(首頁) 課程名稱 資料庫系統概論 班級 14計科2班 實驗名稱 資料庫模式設計與建立

IntelliJ IDEA 2017.1 安裝詳細圖解註冊方法

IntelliJ IDEA 2017.1安裝詳細圖解與註冊方法 之前都是用eclipse,但是最近發現看的很多教學視訊都是使用 IntelliJ IDEA,並且高階程式設計師都必須會Intell

桂電-數學計算科學學院-《資料結構實驗-寧黎華編》(實驗一)

實驗一:順序表的基本操作 1、實驗目的 (1) 掌握順序表的基本運算,熟悉對順序表的一些基本操作和具體函式的定義。 (2) 掌握順序儲存的概念,學會定義線性表的順序儲存型別。 (3) 熟悉c語言程式的基本結構,掌握程式中的使用者標頭檔案、實現檔案和主檔案之間的相

復旦大學2016--2017學年第二學期(16級)高等代數II期末考試第六大題解答

白皮書 理論 begin 思想 math 定性 mes 三種 完全 六、(本題10分) 設 $A$ 為 $n$ 階半正定實對稱陣, $S$ 為 $n$ 階實反對稱陣, 滿足 $AS+SA=0$. 證明: $|A+S|>0$ 的充要條件是 $r(A)+r(S)=n$.

2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) Solution

A:Alphabet Solved. 籤。 1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[60]; 4 int f[60]; 5 int main(){ 6 scanf("%s",

2016河南科技學院CSDN高校俱樂部——PS課程

photoshop課程講解 時間:2016年11月20日晚7:30~~9:30 地點:一合一 主講人:海天教育楊老師 主講內容:PS 參與人員:CSDN協會&計算機協會成員 這次講課由海天教育楊老師主講,所以大家都很積極呢,不過我想最主要的原因還是大家對PS的好奇和

2016-2017 CT S03E01: Codeforces Trainings Season 3 Episode 1 J Wrong Answer 最大獨立集

題意: 一個最大為2000*2000的矩陣,有h個橫著的單詞,v個豎著單詞,橫著的可能與豎著的有交叉,交叉的字元只能選其一放在格子內,問怎樣選擇才能使矩陣內單詞的數量最多,輸出最多有多少個。(注意同一行的單詞不會有交叉) 解法: 最大獨立集,因為橫著的與橫著不會有交叉,豎著

2016年河南科技學院CSDN高校俱樂部——路由器配置

路由器配置 時間:11月26日(週六)9-10節 地點:一合二教室 主講人:牛燕尾,CSDN協會會長 主講內容:無線路由器配置,網路搜尋,程式設計入門 無線路由器有很多品牌,具體步驟要根據該品牌的說明書來進行,大致步驟為:①在瀏覽器介面輸入192.168.1.1,一般會要求

湘潭大學2017年下學期程式設計實踐-模擬測試1 題解

XTU 1284 多項式 思路:直接迴圈求解便可,注意長整型溢位的問題 (a+b)%m = a%m + b%m 可根據這個式子求解,另外注意多次方有可能溢位LL。 #include <bits/stdc++.h> using nam

2016河南科技學院CSDN高校俱樂部——見面會

csdn高校俱樂部見面會 時間:2016年10月23日下午七點半 地點:二合三 在招新過後的第一個週日,小石榴們心心念唸的見面會終於開始了!關於時間,有必要說一下,其實歷屆的見面時間都是在週六的晚上,但小石榴們都有課,所以就定到週日了。即使這樣,還是有一部分參加紅歌活動的同

2016河南科技學院csdn高校俱樂部計算機協會協作——校園PPT設計大賽

綠色環保,低碳減排 時間:2016年12月4日下午地點:10合二參賽人員:全體在校學生 大賽開始前,社團的幹事們就早早的到場開始佈置教室,很快一個嶄新的教室就被大家精心佈置了出來,三點前,小夥伴們都陸陸續續到了,靜靜坐下等待大賽的開始。 本次PPT大賽是面對全校同學舉行的,

2016河南科技學院csdn高校俱樂部——網線製作

網線製作 時間:12月4日(週日晚9-10節)地點:四合二主講人:呂夢楠,CSDN副會長主講內容:網線製作 網線製作的一般步驟: ①準備材料②抽出外套層③露出四對線對④按序號排好⑤用網鉗把網線剪齊⑥把網線插入水晶頭⑦放入網鉗的RJ-45壓口⑧用網鉗把水晶頭壓緊、壓實⑨檢

pycharm-professional-2017.1.1.exe專業版激活方法

jet border pop hle rri xv6 baidu msf lrj pycharm 2017.1專業版破解碼只用了一個月就到期了,又找到一個方法,又可以用了~~~ 1.在server選項裏邊輸入 http://elporfirio.com:1017/就可以了。

20145207 2016-2017《Java程序設計》課程總結

比較 結果 總結 然而 第六章 引入 公開 課程總結 實驗 20145207 2016-2017《Java程序設計》課程總結 目錄 一、每周作業及實驗報告鏈接匯總 二、關於博客 自認為寫得最好一篇博客是?為什麽? 作業中閱讀量最高的一篇博客是?談談經驗。 作業中與師生交