通州微平臺網站建設網站開發(fā)的步驟
1、
拿到題目一定要讀懂題意,不要看到這題目就上來模擬什么閏年,一月的天數(shù)啥的。這個題目問你當天的時間,就說明年月日跟你都沒關系,直接無視就好了。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>using namespace std;#define ll long long//能開long long就開,避免爆數(shù)據 int main()
{ll n;cin >> n;n /= 1000;//先把毫秒轉化為秒 ll hour = (n / 60 / 60) % 24;//求出小時數(shù),一定要記得取模 ll minute = (n % 3600 / 60) % 60;//分鐘數(shù) ll s = n % 3600 % 60;//秒數(shù) if (hour < 10) cout << 0;//記得處理好零的輸出 cout << hour << ':';if (minute < 10) cout << 0;cout << minute << ':';if (s < 10) cout << 0;cout << s;return 0;
}
?2、
(1)動態(tài)規(guī)劃:
閆氏dp分析法:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>using namespace std;#define N 1010000int f[150][N] ,n ,w[N] ,ans ,sum; int main()
{cin >> n;for (int i = 1 ;i <= n ;i ++) cin >> w[i] ,sum += w[i];//拿sum存儲砝碼的重量之和 f[0][0] = 1;//初始化,零個砝碼測出質量為0的方案有一個 for (int i = 1 ;i <= n ;i ++){for (int j = 0 ;j <= sum ;j ++){f[i][j] = f[i - 1][j];//第i個砝碼沒有用 f[i][j] += f[i - 1][abs(j - w[i])];//第i個砝碼放左邊 f[i][j] += f[i - 1][j + w[i]];//第i個砝碼放右邊 }}for (int i = 1 ;i <= sum ;i ++)if (f[n][i]) ans ++;//如果有值,說明前n個砝碼可以測出來重量為i的物品,答案加一 cout << ans;return 0;
}
(2)dfs暴力,拿一半分
如果這道題實在沒時間做或者說想不到思路,那么我們就可以考慮暴力拿分
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>using namespace std;#define N 1010000int n ,w[N] ,ans;
bool vis[N];void dfs(int k ,int g)
{if (k > n){if (g > 0 && !vis[g]){ans ++;vis[g] = true;}return;}dfs(k + 1 ,g);dfs(k + 1 ,g + w[k]);dfs(k + 1 ,abs(g - w[k]));
}int main()
{cin >> n;for (int i = 1 ;i <= n ;i ++){cin >> w[i];}dfs(0 ,0);cout << ans; return 0;
}
3、
?
?這一屆的題目從這一題開始往后,難度就起來了。
1、先說暴力做法吧,可以拿四十分,直接預處理一千行
#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;const int N = 1e3 + 10;int n = 1000;
int a[N][N];int main() {a[1][1] = 1;for (int i = 2; i <= n; i ++) // 預處理for (int j = 1; j <= i; j ++)a[i][j] = a[i - 1][j] + a[i - 1][j - 1];int x; cin >> x;int cnt = 0;for (int i = 1; i <= n; i ++) // 枚舉for (int j = 1; j <= i; j ++) {cnt ++;if (a[i][j] == x) {cout << cnt;return 0;}} return 0;
}
2、正解
關于這道題我們需要明白:楊輝三角其實就是組合數(shù)!如圖:
?從圖中我們可以觀察出兩個性質:
1、以中間的紫色分割線為界,左右兩邊的數(shù)值是相等的。那么右邊存在的某一個值左邊一定也存在,并且根據題目的排序方式來看左邊相對而言更加靠前,也就是說某一個數(shù)N第一次一定是在左邊先出現(xiàn)。因此,我們要找的結果一定是在左邊部分中。
2、中間一列數(shù)從上往下是在遞增的,每一橫排從左往右也在遞增,每一斜行從上往下也在遞增。所以每個斜行都保持了單調性。
現(xiàn)在知道了這兩個性質,我們可以想想怎么從左邊中找到N。直接枚舉的復雜度太高,不可取,而根據第二條中所提到的單調性,我們可以很自然的想到二分法。那么該如何二分?豎著?橫著?這都不可取,因為不論是哪一種我們都無從下手。所以我們需要斜著來!每一個斜行從紫色部分開始,也就是C(k,2*k)的形式,到C(k ,n)結束(為什么從n結束?可以思考一下,倘若想不明白可以私信問我)。由于n最大1e9,C(34, 17) > 1e9, C(32, 16) < 1e9,因此只要枚舉前16個斜行即可。
?C(k, r)對應的順序值為:(r + 1) * r / 2 + k + 1
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>using namespace std;#define ll long longll n;ll c(int a ,int b)
{ll res = 1;for (int i = a ,j = 1 ;j <= b ;i -- ,j ++)//求組合數(shù)的過程 {res = res * i / j;if (res > n) return res;//如果res已經大于n就不用在求了,肯定不是答案,直接返回。這樣也可以避免爆數(shù)據 }return res;
}bool h(int k)
{int l = 2 * k ,r = n;while (l < r){ll mid = (l + r) / 2;if (c(mid ,k) >= n) r = mid;elsel = mid + 1;}if (c(l ,k) != n) return false;cout << 1ll * (l + 1) * l / 2 + k + 1;//如果找到了,輸出位置 return true;
}int main()
{cin >> n;for (int i = 16 ; ;i --)//枚舉前十六個斜行 if (h(i)) break;return 0;
}
4、
我也不會。。。
5、
?
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>using namespace std;#define ll long long
#define N 5500const int mod = 1000000007;ll f[N][N] ,len;
char s[N];ll hu()
{memset(f ,0 ,sizeof(f));f[0][0] = 1;for (int i = 1 ;i <= len ;i ++){if (s[i] == '('){for (int j = 1 ;j <= len ;j ++)f[i][j] = f[i - 1][j - 1];}else {f[i][0] = (f[i - 1][0] + f[i - 1][1]) % mod;for (int j = 1 ;j <= len ;j ++)f[i][j] = (f[i - 1][j + 1] + f[i][j - 1]) % mod;}}for (int i = 0 ;i <= len ;i ++)if (f[len][i]) return f[len][i];return -1;}int main()
{scanf("%s" ,s + 1);len = strlen(s + 1);ll l = hu();reverse(s + 1 ,s + len + 1);for (int i = 1 ;i <= len ; i ++){if (s[i] == '(') s[i] = ')';elses[i] = '(';}ll r = hu();printf("%lld" ,l * r % mod);return 0;
}
?