ACM-ICPC 2018 焦作賽區網路賽
阿新 • • 發佈:2019-02-16
B. Mathematical Curse (DP)
這是一類題目,DP求最大最小值,因為存在正負值反轉所以最大值最小值都要儲存。
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define clr(s, x) memset(s, x, sizeof(s))
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
inline int read(){int r=0;char c=getchar();while(c<'0'||c>'9') {c=getchar();}while(c>='0'&&c<='9') {r=r*10+c-'0';c=getchar();}return r;}
inline ll readll(){ll r=0;char c=getchar();while(c<'0'||c>'9') {c=getchar();}while(c>='0'&&c<='9') {r=r*10+c-'0';c=getchar();}return r;}
const int INF = 0x3f3f3f3f;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
const int MAXN = 1e3+15;
const int MAXM = 1e3+15;
ll Max[MAXN][7], Min[MAXN][7];
ll a[MAXN];
char op[7];
ll calc(ll n, ll m, char op){
if(op == '+') return n + m;
if(op == '-') return n - m;
if(op == '*') return n * m;
if(op == '/') return n / m;
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
ll val, n, m;
int T;
cin >> T;
while(T--){
cin >> n >> m >> val;
for(int i=1; i<=n; ++i) cin >> a[i];
for(int i=1; i<=m; ++i) cin >> op[i];
for(int i=0; i<=n; ++i) {
for(int j=0; j<=m; ++j){
Max[i][j] = -LLINF;
Min[i][j] = LLINF;
}
}
Max[0][0] = val;
Min[0][0] = val;
for(int i=1; i<=n; ++i){
Max[i][0] = val;
Min[i][0] = val;
for(int j=1; j<=m; ++j){
Max[i][j] = Max[i-1][j];
Min[i][j] = Min[i-1][j];
if(Max[i-1][j-1] != -LLINF){
Max[i][j] = max(Max[i][j], calc(Max[i-1][j-1], a[i], op[j]));
Min[i][j] = min(Min[i][j], calc(Max[i-1][j-1], a[i], op[j]));
}
if(Min[i-1][j-1] != LLINF){
Max[i][j] = max(Max[i][j], calc(Min[i-1][j-1], a[i], op[j]));
Min[i][j] = min(Min[i][j], calc(Min[i-1][j-1], a[i], op[j]));
}
}
}
cout << Max[n][m] << endl;
}
return 0;
}
G. Give Candies
二項式定理+費馬小定理降冪
降冪公式:
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define clr(s, x) memset(s, x, sizeof(s))
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
inline int read(){int r=0;char c=getchar();while(c<'0'||c>'9') {c=getchar();}while(c>='0'&&c<='9') {r=r*10+c-'0';c=getchar();}return r;}
inline ll readll(){ll r=0;char c=getchar();while(c<'0'||c>'9') {c=getchar();}while(c>='0'&&c<='9') {r=r*10+c-'0';c=getchar();}return r;}
inline ll qpow(ll a,ll b,ll mod){ll res=1;while(b){if(b&1)res = (res*a)%mod;a=(a*a)%mod;b>>=1;}return res;}
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
const int MAXN = 1e5;
const int MAXM = 1e5;
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int T;
cin >> T;
while(T--){
string s;
cin >> s;
int len = s.length();
ll ans = 0;
for(int i=0; i<len; ++i){
ans = (ans*10 + s[i]-'0')%(mod-1);
}
cout << qpow(2, ans-1, mod) << endl;
}
return 0;
}
K. Transport Ship
01揹包
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
#define clr(s, x) memset(s, x, sizeof(s))
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
inline int read(){int r=0;char c=getchar();while(c<'0'||c>'9') {c=getchar();}while(c>='0'&&c<='9') {r=r*10+c-'0';c=getchar();}return r;}
inline ll readll(){ll r=0;char c=getchar();while(c<'0'||c>'9') {c=getchar();}while(c>='0'&&c<='9') {r=r*10+c-'0';c=getchar();}return r;}
inline ll qpow(ll a,ll b,ll mod){ll res=1;while(b){if(b&1)res = (res*a)%mod;a=(a*a)%mod;b>>=1;}return res;}
inline ll gcd(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
const double eps = 1e-8;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
const int MAXN = 1e4+10;
const int MAXM = 1e4+10;
ll dp[MAXN];
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int T, V, C, n, q, s;
scanf("%d", &T);
while(T--){
scanf("%d %d", &n, &q);
clr(dp, 0);
dp[0] = 1;
for(int i=1; i<=n; ++i){
scanf("%d %d", &V, &C);
for(int k=0; k<C; ++k){
int v = V<<k;
for(int j=MAXN; j>=v; --j){
dp[j] += dp[j-v];
dp[j] %= mod;
}
}
}
while(q--){
scanf("%d", &s);
printf("%lld\n", dp[s]);
}
}
return 0;
}
L. Poor God Water
線性遞推,公式:a[i]=2a[i-1]-a[i-2]+3a[i-3]+2*a[i-4]
然後矩陣快速冪就好了。
還可以用BW求,這個需要多給幾項。