9.14考試總結
阿新 • • 發佈:2018-09-15
沒有 freopen scanf 總結 子串和 數學 pac ans 推銷員
9.14考試總結
感覺考試範圍逐漸偏離自己能力範圍。所以要加緊學習
小朋友的數字
DP題目,顯示最大子串和,再是直接暴力
主要註意可能會爆long long;所以要理性分析
簡單的推理就可以知道這個是單調上升或者下降的,所以只要判斷與第一個數據的大小關系就可以推出最後結尾的答案
#include<bits/stdc++.h> #define IL inline #define open(s) freopen(s".in", "r", stdin); freopen(s".out", "w", stdout); #define ll long long #define ull unsigned long long using namespace std; ll n, p; ll a[1000010], b[1000010]; bool pd; IL int read(); int main() { // open("number"); n = read(); p = read(); for (int i=1; i<=n; ++i) { a[i] = read(); a[i] = max(a[i], a[i-1]+a[i]); } for (int i=2; i<=n; ++i) a[i] = max(a[i], a[i-1]); b[1] = a[1]; b[2] = b[1] + a[1]; pd = 0; for (int i=3; i<=n; ++i) { b[i] = b[i-1]; if (a[i-1] > 0) b[i] += a[i-1]; if (b[i] > b[1]) pd = 1; if (pd) b[i] %= p; } if (pd) cout << b[n]%p << endl; else cout << b[1]%p << endl; return 0; } int read() { int i = 0, j = 1; char x = getchar(); while (x < '0' || '9' < x) { if (x == '-') j = -1; x = getchar(); } while ('0' <= x && x <= '9') { i = i * 10 + x - '0'; x = getchar(); } return i*j; }
車站分級
好像牽涉到拓撲排序(未學暫不處理)
求和
部分分方法就是枚舉開始點和結束點
滿分必須要分析數學原理,變成o(n)算法
#include<bits/stdc++.h> #define IL inline #define open(s) freopen(s".in", "r", stdin);// freopen(s".out", "w", stdout); #define ll long long #define ull unsigned long long using namespace std; int n, m; int s[100005][2], sum[100005][2], c[100005], x[100005], ans; IL int read(); int main() { // open("sum5"); n = read(); m = read(); for (int i=1;i<=n;i++) scanf ("%d",&x[i]); for (int i=1;i<=n;i++) { scanf ("%d",&c[i]); s[c[i]][i%2]++;//姹傚嚭榪欎釜鍒嗙粍涓湁澶氬皯涓暟 sum[c[i]][i%2] = (sum[c[i]][i%2] + x[i])%10007; } for (int i=1;i<=n;i++) ans = (ans + i * ((s[c[i]][i%2]-2) * x[i] % 10007 + sum[c[i]][i%2])) % 10007; printf ("%d\n",ans);//鏈€鍚庤緭鍑? return 0; } int read() { int i = 0, j = 1; char x = getchar(); while (x < '0' || '9' < x) { if (x == '-') j = -1; x = getchar(); } while ('0' <= x && x <= '9') { i = i * 10 + x - '0'; x = getchar(); } return i*j; }
推銷員
貪心水體,因為數據比較水,怎麽樣都可以過
就沒有放代碼的意義可能是錯的
9.14考試總結