1. 程式人生 > >ACM-ICPC 2018 焦作賽區網路賽

ACM-ICPC 2018 焦作賽區網路賽

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
二項式定理+費馬小定理降冪
降冪公式:ab%p=ab%φ(p)%pa^b\%p=a^{b\% \varphi(p)}\%p

#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求,這個需要多給幾項。