zoukankan      html  css  js  c++  java
  • 10.26训练赛

    emmmmm, 本来事不打算打这场比赛的, 队友都没打, 但是我到实验室的时候刚好开始, 好多人在打, 那我也就打把, 然后, 拉的一批, 先是电脑连不上网, 然后进去后A掉了3道水题, 其中一个线段树调试的时间还是挺长的, 下次要注意, 然后我看到了A题, 我甚至可以说, 我真的想到了题解, 连滚动数组我都想到了, 但是在实现上还是没有成功, 一是没有看时间, 限制竟然是两秒,二是为了枚举可行的点用vector浪费了时间(或许是map),这道题的数据还是卡的比较死的, 所以写了两个小时后我就去写数学了, 在半夜,我看了H题, 也是触摸到了正解的边缘, 但还是没有突破, 所以, 怎么去突破这个瓶颈, 是我现在所需要面对的问题


    A. Mio visits ACGN Exhibition
    现在看这道题真的很简单, 就是dp一下就行了, 确实没什么可讲的, 不过下次有这种求方案数的题 , 可以把所有的情况都枚举了, 不要用map去强行开数组了, 因为数据过大的情况下空间会不够, 并且clear也会费时间, 即使这种情况不存在;

    点击查看代码
    #include <bits/stdc++.h>
    
    using namespace std; 
    
    //#define int long long
    typedef long long ll;
    const int mod = 998244353;
    const int N = 3e5 + 10;
    const int M = 5e2 + 10;
    
    template < typename T > inline void read(T &x) {
    	x = 0; T ff = 1, ch = getchar();
    	while (!isdigit(ch)) {
    		if (ch == '-') ff = -1;
    		ch = getchar();
    	} 
    	while (isdigit(ch)) {
    		x = (x << 1) + (x << 3) + (ch ^ 48);
    		ch = getchar();
    	}
    	x *= ff;
    }
    
    
    int n, m, p, q, ans = 0, a[M][M];
    int f[2][M][M << 1];
    
    int main() {
    	read(n), read(m), read(p), read(q);
    	for (int i = 1; i <= n; ++i) 
    		for (int j = 1; j <= m; ++j) 
    			read(a[i][j]);
    	f[0][1][0] = 1;
    	for (int i = 1; i <= n; ++i) {
    		int u = i & 1, v = u ^ 1;
    		for (int j = 1; j <= m; ++j) {
    			int w = a[i][j];
    			if (!a[i][j]) f[u][j][0] = (f[v][j][0] + f[u][j - 1][0]) % mod;
    			else f[u][j][0] = 0;
    			for (int k = 1; k <= i + j - 1; ++k) 
    				f[u][j][k] = (f[v][j][k - w] + f[u][j - 1][k - w]) % mod;
    		}
    	}
    	int u = n & 1;
    	for (int i = q; i <= n + m - 1 - p; ++i) 
    		ans = (ans + f[u][m][i]) % mod;
    	printf("%d
    ", ans);
    	return 0;
    }
    
    

    H. Hearthstone So Easy
    挺有意思的一道题, 可能因为最近学了博弈论的缘故, 看到这个就想起来了, 但这个好像不符合那个条件, emmmm, 刚开始在我看来, 两个人直接杀就行了, 不用回血,然后我就二分去判断两个人在哪个回合会失败, 但我后来想到, 后面的人摸牌扣血在前面的人之后, 所以我只要一直回血称到前面的人扣血而死不就行了, 然后我就改了个二分的条件,还是错的。 其实这个题不具有二分性, 因为假如A在i+1回合刚好杀了B, 那么B在i回合一定能杀了A,非常绕, 就是在第i回合A操作以后, B进入了A的斩杀线, 但此时A的血量在B造成伤害之后下一回合还不至于掉血而死, 那么B就回血, 这样每个回合之后两人的血量会自然掉, 直到A能掉血掉死B就出手, 真的很绕。。。

    点击查看代码
    #include <bits/stdc++.h>
    
    using namespace std; 
    
    #define int long long
    typedef long long ll;
    const int mod = 998244353;
    const int N = 5e4 + 10;
    const int M = 5e2 + 10;
    
    template < typename T > inline void read(T &x) {
    	x = 0; T ff = 1, ch = getchar();
    	while (!isdigit(ch)) {
    		if (ch == '-') ff = -1;
    		ch = getchar();
    	} 
    	while (isdigit(ch)) {
    		x = (x << 1) + (x << 3) + (ch ^ 48);
    		ch = getchar();
    	}
    	x *= ff;
    }
    
    int t, n, k;
    ll sum[N]; 
    
    signed main() {
    	read(t);
    	while (t--) {
    		read(n), read(k);
    		int b1 = n, b2 = n;
    		b1 -= 1;
    		if (b1 <= 0) {
    			puts("freesin");
    			continue;
    		} 
    		b2 -= 1, b2 -= k;
    		if (b2 <= 0) puts("pllj");
    		else puts("freesin");
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    UI 常用方法总结之--- UITableView
    UITextFiled 通知监听
    ios 本地通知
    AFNetworking 请求头的设置
    UI总结
    gitlab-server环境搭建
    redis 配置文件示例
    搭建spark集群
    kafka集群安装
    zookeeper集群搭建
  • 原文地址:https://www.cnblogs.com/AK-ls/p/15468706.html
Copyright © 2011-2022 走看看