ACM-ICPC 2018 焦作赛区网络赛

7 篇文章 0 订阅
5 篇文章 0 订阅

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
二项式定理+费马小定理降幂
降幂公式: a b % p = a b % φ ( p ) % p a^b\%p=a^{b\% \varphi(p)}\%p ab%p=ab%φ(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求,这个需要多给几项。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值