自己用c語言做的,不盡如意
后面看了題解,用的是c++,其中string 變量和字符串拼接感覺比c方便好多,可以用更少的代碼實現更好的效果,打算之后去學習c++,用c++寫算法。
遞歸,不斷輸入字符,若遇到[,則輸入解壓次數k,重新調用函數,將[中的]字符串重復k次,加在總字符串后,遇到]就返回總字符串,否則將字符加在總字符串尾。
#include<iostream>
using namespace std;
string yunqian() {int k;char ch;string s = "", str = "";while (cin >> ch) {if (ch == '[') {cin >> k;str = yunqian();while (k--) {s += str;}}else if (ch == ']') {return s;}else {s += ch;}}return s;
}
int main()
{ string s=yunqian();cout << s;return 0;
}
遞推,
對于2*n的墻,當其還剩最后一列沒鋪時,用發a[n-1]表示,豎著鋪2*1的磚即可鋪滿;
當其還剩最后一列沒鋪時,用發a[n-1]表示,橫著著鋪兩個2*1的磚即可鋪滿;
當其還剩最后一列和倒數第二列的一個沒鋪時,用b[n-2]表示,
可以拆掉一塊三單元的磚,使其變成a[n-3];
也可以拆掉一塊橫向2*1的磚,使其變為b[n-3];
得到公式:
a[i] = a[i - 1] + a[i - 2]d + 2 * b[i - 2];
b[i] = a[i - 1] + b[i - 1];
#include <iostream>
using namespace std;
int a[1000005],b[1000005];
int mod = 10000;
int main()
{int n;cin >> n;a[0] = 1;b[0] = 0;a[1] = 1;b[1] = 1;for (int i = 2; i <= n; i++) {a[i] = ((a[i - 1] + a[i - 2])%mod + 2 * b[i - 2]%mod)%mod;b[i] = (a[i - 1] + b[i - 1])%mod;}cout <<a[n];return 0;
}
水題,用結構體確保可以正確輸入序號,為了使等待時間最短,將節水時間按從小到大排序,可得,對于第i個人,等待時間為n-乘以Ti,保留兩位小數
#include <iostream>
using namespace std;
struct {int d;int i;
}a[1006],t;
int main()
{int n;double sum = 0;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i].d;a[i].i = i;}for (int i = 1; i <= n - 1; i++) {for (int j = 1+i; j <= n; j++) {if (a[i].d > a[j].d) {t = a[i];a[i] = a[j];a[j] = t;}}}for (int i = 1; i <= n; i++) {sum += (n - i)*a[i].d;}sum /= n;for (int i = 1; i <= n; i++) {cout << a[i].i<<" ";}cout << "\n";printf("%0.2f", sum);return 0;
}
貪心:
從1到n-1遍歷循環,若這個盒子和下一個盒子的糖果之和大于x,則 將下個盒子的糖果吃到x顆
之后就可以成功的報錯了
需要注意特殊情況,對第一個盒子單獨判斷,若里面的糖果數量大于x,吃掉其中糖果,直到剩下x顆糖,從二開始循環就可以ac了。
#include <iostream>
using namespace std;
int main()
{int n,x;int a[100005];long long sum = 0;cin >> n;cin >> x;cin >> a[1];if (a[1] > x) {sum += a[1] - x;a[1] = x;}for (int i = 2; i <= n; i++) {cin >> a[i];}for (int i = 1; i <= n - 1; i++) {while (a[i] + a[i + 1] > x) {sum += a[i] + a[i + 1] - x;a[i + 1] = x - a[i];}}cout << sum;
}
用結構體數組存儲每場比賽的開始時間與結束時間,將數組按照結束時間升序排列。
現在的時間初始為零,從前往后循環數組,若開始時間大于等于現在的時間,則現在的時間等于這場比賽的結束時間,參加的比賽加一。
#include <iostream>
#include <algorithm>
using namespace std;
int n, t, num;
struct node{int l;int r;
}a[1000006];
bool cmp(node a, node b) {return a.r < b.r;
}
int main()
{cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i].l>> a[i].r;}sort(a+1, a + n+1,cmp);for (int i = 1; i <= n; i++) {if (a[i].l >= t) {t = a[i].r;num++;}}cout << num;return 0;}