1. 程式人生 > 其它 >刷題(1)

刷題(1)

技術標籤:演算法

數列

題目描述

聯歡會上,主持人先在黑板上寫了四個數字,分別是:2,0,1,9,然後說:“這串數字從第五個數起,每一個數都是它前四數字之和的個位數字”。請你列印輸出這個數列的前N項,並計算前N項的和。

輸入

單個整數:表示項數N(1 ≤ N ≤ 100000)

輸出

第一行:N個數字,表示所求數列的前N項。
第二行:單個數字,表示前N項數字的和

樣例輸入

10

樣例輸出

2 0 1 9 2 2 4 7 5 8 
40

別人の答案

#include<bits/stdc++.h>
using namespace std;
int main(){

	int n,sum=12,t=12,k=0,a[10000]={2,0,1,9};
	cin>>n;
	for(int i=0;i<4;i++) 
		cout<<a[i]<<" ";
	for(int i=4;i<n;i++){
		a[i]=t%10;//取出和的個位數 
		cout<<a[i]<<" ";
		sum+=a[i];//總和 
		t-=a[k];//當前四位數,減掉前一位,加上新的一位 
		t+=a[i];		
		k++;
	}

	return 0;
}

ME答案

#include <iostream>
#include <cstdio>

using namespace std;

const int N = 1e6 + 10;
int a[N], res;

int main()
{
    int n;
    cin >> n;
    a[0] = 2;
    a[1] = 0;
    a[2] = 1;
    a[3] = 9;
    for (int i = 4; i < n; i++)
        a[i] = (a[i - 1] + a[i - 2] + a[i - 3] + a[i - 4])%10;
    res = 0;
    for (int i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
        res += a[i];
    }
    cout << endl;
    printf("%d", res);

    return 0;

}

煩惱

題目描述

老師每天都要批改作文,他想知道這篇作文有多少字元,以及多少單詞,請你幫助他。

輸入

單獨一行字串:表示作文的內容,保證只出現大小寫英文字母、數字或空格。

輸出

第一行:單個整數,表示輸入字串中的可見字元的個數。英文字母和數字屬於可見字元,空格和換行屬於不可見字元。
第二行:單個整數,表示輸入字串中的單詞個數。單詞是指連續的,由可見字元組成的字串。

樣例輸入 [Copy]

【樣例1】
One apple a day
【樣例2】
7 days a week

樣例輸出 [Copy]

【樣例1】
12 
4
【樣例2】
10 
4

提示

設輸入字串長為|S|,保證1 ≤ |S| ≤ 100000,兩個相鄰的單詞間有且僅有一個空格。

別人の答案

#include<bits/stdc++.h>
using namespace std;
int main(){
	int k=0,w=1;
	string s;
	getline(cin,s);
	int l=s.length();//求字串的長度 
	for(int i=0;i<l;i++){
		//記錄單詞個數
		if((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){
			//字母 數字
			k++;
		} 	
		// 單詞 
		else if(s[i]==' '){
			w++;
		}
	}
	cout<<k<<endl<<w<<endl;
	return 0;
}

ME答案

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

using namespace std;

int main()
{
	string a;
	getline(cin, a);
	int count = 0, number = 0;
	for (int i = 0; i < a.length(); i++)
	{
		if (a[i] != ' ') count++;
		if (a[i] == ' ') number++;
	}

	cout << count << endl << number + 1;

	return 0;

}

停車計費

題目描述

某小區對外來車輛按照如下規則計費:
·半小時內(含半小時),免費;
·超過半小時到六小時(含六小時),每小時 2 元,不足一小時以一小時計算;
·超過六小時,每小時 5 元,不足一小時以一小時計算。
給定車輛的進入和離開時間(保證沒有跨過一天的零點),請計算應收金額。

輸入

第一行:一個字串,表示車輛進入小區的時間。
第二行:一個字串,表示車輛離開小區的時間。
輸入採用“HH:MM:SS”的形式表示時間,其中“HH”表示小時,範圍為 00 到 23,“MM”
表示分鐘,範圍為 00 到 59,“SS”描述秒數,範圍為 00 到 59。時、分、秒均為兩位數。

輸出

第一行:表示車輛的停留時間,格式與輸入保持相同。
第二行:單個整數,表示停車費用。

答案

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main()
{
	string sat, end;
	cin >> sat >> end;
	int ss = 0, se = 0,spend;
	for (int i = 0; i < sat.length(); i++)
		ss = (sat[0] * 10 + sat[1]) * 3600 + (sat[3] * 10 + sat[4]) * 60 + (sat[6] * 10 + sat[7]);
	for (int i = 0; i < end.length(); i++)
		se = (end[0] * 10 + end[1]) * 3600 + (end[3] * 10 + end[4]) * 60 + (end[6] * 10 + end[7]);
	int dif = se - ss;

	if (dif <= 1800) spend = 0;
	else if (dif > 1800 && dif <= 21600) spend = ceil((dif / 3600.0)) * 2;
	else spend = ceil((dif / 3600.0)) * 5;

	int hours = dif / 3600;
	int minutes = (dif - hours * 3600) / 60;
	int seconds = dif - hours * 3600 - minutes * 60;
	if (hours >= 10) printf("%d:", hours);
	else printf("0%d:", hours);
	if (minutes >= 10) printf("%d:", minutes);
	else printf("0%d:", minutes);
	if (seconds >= 10) printf("%d", seconds);
	else printf("0%d", seconds);
	cout << endl << spend;
	return 0;
}

小區評比

題目描述

某城市有 16 個小區,這些小區分別用大寫的英文字母 A 到 P 編號。為建立文明城市,工作人員對一些小區進行了檢查,並且評出了分數,評分結果可以用以下字串表示:
分數1小區編號1分數2小區編號2分數3小區編號3⋯ ⋯ 分數n小區編號n#
這串字串的格式說明如下:
·每個分數都是 1 到 100 之間的整數,也包括 1 和 100;
·每個小區編號都是大寫英文字母 A 到 P 中的一個,保證沒有重複的編號出現;
·最後一個結束字元為#,表示記錄終止。
請你讀入資料後統計並分析,輸出分數最高和最低的小區編號。

輸入

第一行:一個字串,表示各個小區的分數分佈。

輸出

第一個字母:表示得分最高的小區編號,如果有多個小區並列最高,只輸出字母順序中最靠前的編號。
第二個字母:表示得分最低的小區編號,如果有多個小區並列最低,只輸出字母順序中最靠前的編號。

樣例輸入

85K98B87D80F92H78C96A#

樣例輸出

BC

提示

A小區96分,B小區98分,C小區78分,D小區87分,F小區80分,H小區92分,K小區85分。最高分是B小區,最低分是C小區。

TLE做法

#include <iostream>
#include <string>

using namespace std;

const int N = 40;
int r[N];

int main()
{
	ios::sync_with_stdio(false);
	int number = 0;
	int max = 0, ma;
	int min = 100, mi;
	string s;
	cin >> s;
	for (int i = 0, j = 0; i < s.size();number += 2,j+=2)
	{
		if (s[i] == '#') break;
		if (s[i] >= '0' && s[i] <= '9' && s[i + 1] >= '0' && s[i + 1] <= '9')
		{
			r[j] = (s[i] - '0')* 10 + s[i + 1] - '0';
			r[j+1] = (int)s[i + 2];
			i += 3;
		}
		else if (s[i + 1] >= 'A' && s[i + 1] <= 'Z' && s[i] >= '0' && s[i] <= '9' )
		{
			r[j] = s[i] - '0';
			r[j + 1] = (int)s[i + 1];
			i += 2;
		}
	}
	
	for (int i = 0; i < number; i += 2)
	{
		if (r[i] > max) 
		{
			max = r[i];
			ma = i +1 ;
		}
		if (r[i] < min)
		{
			min = r[i];
			mi = i + 1 ;
		}
	}
	cout << (char)r[ma] << (char)r[mi];
	return 0;
}

別人の答案(也™是錯的)

#include <bits/stdc++.h>
using namespace std;
struct bs{
    int t;
    char b;
};
bool cmp(bs a,bs c){
    if(a.t>c.t){
        return 1;
    }
    else if(a.t == c.t){
        return a.b<c.b;
    }
    else return 0;
}
int main()
{
    bs a[10000];
    int t = 0,k = 0;
    string s;
    cin >> s;
    int l = s.length();
    for(int i = 0;s[i]!='#';i++){ 
		if(s[i]>='0'&&s[i]<='9'){
		
			t=t*10+s[i]-'0';
		}else{ 
			a[k].t=t;
			a[k].b=s[i];
			t=0;
			k++;
		}
	}
 
	sort(a,a+k,cmp);
	cout<<a[0].b<<a[k-1].b;
	
	return 0;
}

貪婪的國王

題目描述

有個國王喜歡不斷積累金幣,有一天,他向國民宣佈了新的徵收辦法:
·第一天,國民要向國王繳納一枚金幣;
·第二天和第三天,國民每天要向國王繳納兩枚金幣;
·在之後的三天,也就是第四、第五、第六天,國民每天要向國王繳納三枚金幣;
·在之後連續四天,也就是第七、八、九、十天,每天繳納四枚金幣;
總結來說,當國民連續n天每天繳納了n枚金幣之後,國王要求在接下來的n + 1天裡每天繳納n + 1枚金幣。
國王有個目標數量T,請問需要徵收多少天金幣,才能讓國王的金幣數量大於或等於T?

輸入

單個整數:表示徵收金幣的目標數量T(1 ≤ T ≤ 100000000)。

輸出

單個整數:表示達到目標數量的天數。

答案

#include <iostream>

using namespace std;

int main()
{
	int target;
	cin >> target;
	int money = 1, sum = 0, day = 0;
	while (sum < target)
	{
		for (int i = 1; i <= money; i++)
		{
			sum += money;
			day++;
			if (sum >= target)
			{
				cout << day << endl;
				break;
			}
		}
	money += 1;
	}

	return 0;
}

等邊三角形

題目描述

將一個等邊三角形的三條邊分別n等分,沿著三條邊的方向做這些等分點的平行線,就得到了一個三角網格。例如n = 6時的網格如圖所示:

img

這個網路中有很多三角形。請求出有多少不同的三角形,並且求出這些不同三角形的面積之和。
兩個三角形如果大小不同,或方向不同,或位置不同,則視作兩個不同的三角形。在求面積的時候,視網格中最小的三角形面積為1。

輸入

單個整數:表示n(2 ≤ n ≤ 500)。

輸出

第一行,單個整數:表示不同三角形的數量。
第二行,單個整數:表示不同三角形的面積總和。

樣例輸

4

樣例輸出

27
87

答案未知(沒看)

甜蜜的煩惱

題目描述

最近珍珍學會了使用電腦,她發現可以利用電腦解決很多事情,並且效率會快許多。比如,在一份名單中找某個人的姓名,在以前,她得依次逐個查詢,速度慢又很容易看錯。現在,她使用選單命令:“編輯”-“查詢”(或按Ctrl+F鍵),在彈出的查詢對話方塊中,輸入要查詢的姓名,電腦就會找到要找的姓名或告訴你不存在你要找的姓名了。真是又快又準,太爽了!

今天珍珍在查詢時,輸入“張明”,電腦告訴她不存在,但她不經意間發現“張 明”是有的!原來,提供原始名單的人,為了格式漂亮在中間輸入了一個空格,因此電腦找不到了。她想這容易解決,繼續查詢“李達”,沒有?查詢“李 達”(中間一個空格),還沒有?原來某些姓名中間的空格數是有多個的!

珍珍想刪除所有姓名中間的空格,但由於名單很多,一個一個刪除太慢了,所以她找到了會程式設計解決問題的你,請你寫一個程式,刪除所有名單中間的空格。

輸入

輸入的第一行只有一個正整數n,表示名單中共有n個人的姓名。
第二行至第n+1行共n行,每行是一個人的姓名(由大小寫英文字母以及字母之間的空格組成)。

輸出

輸出有n+1行,第一行只有一個正整數,表示總共刪除的空格數。
第二行至第n+1行共n行,每行表示一個刪除空格後的姓名(按照輸入姓名的次序)。

樣例輸入

3
ZhangMing	
Li Da
Wu  Ya  Fei

樣例輸出

5
ZhangMing	
LiDa
WuYaFei

提示

100%的資料,1≤n≤10000,每行姓名的字元數不超過100。

答案

#include <iostream>
#include <string>


using namespace std;

int main()
{
	int n,count = 0;
	cin >> n;
	string r;
	while (n != -1)
	{
        string s;
        getline(cin, s);

		
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] != ' ') r += s[i];
			else count++;
		}
		r += '\n';
		n--;
	}

	cout << count << r;

	return 0;

}