刷題(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時的網格如圖所示:
這個網路中有很多三角形。請求出有多少不同的三角形,並且求出這些不同三角形的面積之和。
兩個三角形如果大小不同,或方向不同,或位置不同,則視作兩個不同的三角形。在求面積的時候,視網格中最小的三角形面積為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;
}