Codeforces 1499 A - C

A-Domino on Windowsill

从k1和k2里面找个小的,前面可以竖着放,后面只能横着放,后面黑色的同理,然后判断一下即可。

#include <bits/stdc++.h>

using namespace std;

#define pb emplace_back
#define MP make_pair
#define pii pair<int,int>
#define pll pair<ll,ll>
#define lson rt<<1
#define rson rt<<1|1
#define CLOSE std::ios::sync_with_stdio(false)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-6;
const int N = 1e4 + 10;

int main() {
	int T;scanf("%d",&T);
	int n,w,b,k1,k2;
	while(T--) {
		scanf("%d%d%d",&n,&k1,&k2);
		scanf("%d%d",&w,&b);
		int fg = 0;
		int min_pre = min(k1,k2);
		min_pre += (max(k1,k2) - min(k1,k2)) / 2;
		int min_suf = min(n-k1,n-k2);
		min_suf += (max(n-k1,n-k2) - min(n-k1,n-k2)) / 2;
		if(min_pre < w || min_suf < b) fg = 1;
		if(fg) puts("NO");
		else puts("YES");
	}
	return 0;
}

B-Binary Removals

题意:给你一长度s的01串然后让你删除其中一些两两都不连续的位置,使得这个串达到有序的状态,问你能否实现。

思路:
假如碰到了10这种情况我们有两种删法,删去前面的1和后面的0。

我们优先选择的是去删掉前面的1,因为0后面可以放0或者1,但1后面只能放1,所以我们留着0肯定是更好的,但是如果110这种情况我就不能删1,只能去删0但如果又是1100这种情况,那么我们就不能删0,此时就不可能把它变有序了。

所以我们只需要判断一个0前面是否有两个及以上连续的1或者他后面是不是0即可,删去的字符会不会影响后面呢,我们是否需要修改,删1的话我们就把1的位置变成0,删0的话我们就把0的位置变成1,这样就不会对后面有影响了。

#include <bits/stdc++.h>

using namespace std;

#define pb emplace_back
#define MP make_pair
#define pii pair<int,int>
#define pll pair<ll,ll>
#define lson rt<<1
#define rson rt<<1|1
#define CLOSE std::ios::sync_with_stdio(false)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-6;
const int N = 100 + 10;
char s[N];
int main() {
	int T;scanf("%d",&T);
	while(T--) {
		scanf("%s",s+1);
		int n = strlen(s + 1);
		int fg = 0,cnt1 = 0;
		for(int i = 1;i < n; ) {
			s[i] == '1' ? cnt1++ : cnt1 = max(0,cnt1-1);//注意细节别笨比
			if(s[i] < s[i-1]) {
				if(!cnt1) {
					s[i-1] = '0';
					i++;
				}
				else if(s[i+1] > s[i]) {
					s[i] = '1';
					i++;
				}
				else { fg = 1; break; }
			}
			else  {
				i ++;
			}
		}
		if(fg) puts("NO");
		else puts("YES");
	}
	return 0;
}

C-Minimum Grid Path

题意:
你从(0,0)出发到达(n,n)点,你只能选择往上走或者往右走,并且转向的次数不可以超过n-1,也就是你的路线最多是由n条线段组成的,然后会给定你第i条线段的花费c[i]问你怎样才能使得到达终点的花费最少。

思路:
主要这里c数组是给定好的,顺序不能变,可以想到我们需要留出找出两条花费最少的线段使得其走的步数尽可能的多,由于是到(n,n)点我们先往右或者先往上其实是等效的,所以我们当前步数的奇偶性来定义走的方向。

但是并不是找到两个方向上的最小值就行,因为你不知道最小值比次小值小的那部分值会不会被多走的几步给加回来边的更大,所以我们枚举走的步数,维护一个走到当前位置时,两个方向上的最小值分别是多少,很明显,在两个方向上其他线段我们就只分配一步,剩下的都有当前的最小走完。

这样就是再维护一下前缀和,然后O(1)的就算出当前答案了,最后n步里取个min就是我们的最小花费。

还是要多想多思考题目的条件能怎么巧妙的转化,例如这就是就是把两个方向变成了奇偶去讨论,因为奇偶性改变一次就可以看做方向改变一次。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int N = 1e5 + 10;
int n;
ll c[N],sum[N];

int main() {
    int T;scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);
        for(int i = 1;i <= n;i ++) {
            scanf("%lld",&c[i]);
            sum[i] = sum[i-1] + c[i];
        }
        ll odd = INF,even = INF,ans = INF;
        // cout << odd << ' ' << even << ' ' << ans << '\n';
        //用奇偶来区分方向 只需要在每一步贪心的让当前最小的那个数尽可能夺走即可
        for(int i = 1;i <= n;i ++) {//
            if(i & 1) odd = min(odd,c[i]);
            else even = min(even,c[i]);
            ll res = 0;
            if(i < 2) continue;
            if(i & 1) {
                res = sum[i];
                res += (n - i / 2 - 1) * odd;
                res += (n - i / 2) * even;
            }
            else {
                res = sum[i];
                res += (n - i / 2) * odd;
                res += (n - i /2 ) * even;
            }
            ans = min(ans,res);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蛋白质是生物体中普遍存在的一类重要生物大分子,由天然氨基酸通过肽键连接而成。它具有复杂的分子结构和特定的生物功能,是表达生物遗传性状的一类主要物质。 蛋白质的结构可分为四级:一级结构是组成蛋白质多肽链的线性氨基酸序列;二级结构是依靠不同氨基酸之间的C=O和N-H基团间的氢键形成的稳定结构,主要为α螺旋和β折叠;三级结构是通过多个二级结构元素在三维空间的排列所形成的一个蛋白质分子的三维结构;四级结构用于描述由不同多肽链(亚基)间相互作用形成具有功能的蛋白质复合物分子。 蛋白质在生物体内具有多种功能,包括提供能量、维持电解质平衡、信息交流、构成人的身体以及免疫等。例如,蛋白质分解可以为人体提供能量,每克蛋白质能产生4千卡的热能;血液的蛋白质能帮助维持体内的酸碱平衡和血液的渗透压;蛋白质是组成人体器官组织的重要物质,可以修复受损的器官功能,以及维持细胞的生长和更新;蛋白质也是构成多种生理活性的物质,如免疫球蛋白,具有维持机体正常免疫功能的作用。 蛋白质的合成是指生物按照从脱氧核糖核酸(DNA)转录得到的信使核糖核酸(mRNA)上的遗传信息合成蛋白质的过程。这个过程包括氨基酸的活化、多肽链合成的起始、肽链的延长、肽链的终止和释放以及蛋白质合成后的加工修饰等步骤。 蛋白质降解是指食物中的蛋白质经过蛋白质降解酶的作用降解为多肽和氨基酸然后被人体吸收的过程。这个过程在细胞的生理活动中发挥着极其重要的作用,例如将蛋白质降解后成为小分子的氨基酸,并被循环利用;处理错误折叠的蛋白质以及多余组分,使之降解,以防机体产生错误应答。 总的来说,蛋白质是生物体内不可或缺的一类重要物质,对于维持生物体的正常生理功能具有至关重要的作用。
这是一道 CodeForces 上的题目,题目编号为 749C,题目名称为 Voting。 题目描述: 有 $n$ 个人参加选举,选出一位领导人。每个人都会投票,你知道了每个人选择谁,并且可以知道选票中作废票和弃权票的数量。如果有一个人获得了半数以上的有效选票(即除去作废票和弃权票的票数),那么他将成为领导人。如果没有任何一个人获得半数以上的有效选票,则选举无效。 现在你可以修改任意数量的作废票或弃权票,使选举有效,并使你支持的候选人成为领导人。你需要最少的修改次数。 输入格式: 第一行包含三个整数 $n, a, b$,分别表示选民的数量,作废票的数量和弃权票的数量。 接下来 $n$ 行,每行包含一个字符串,表示每个人的投票情况。如果该字符串为 “YES” 或 “NO”,表示该选民对应的是弃权票;如果该字符串为 “POLL”, 表示该选民对应的是作废票;如果该字符串为其他字符串,则表示该选民对应的是有效选票,该字符串为该选民的投票对象。 输出格式: 如果无法通过修改使选举有效,则输出 -1;否则输出最少的修改次数,使得选举有效,并且你支持的候选人成为领导人。 数据范围: $1 \leq n \leq 2000, 0 \leq a, b \leq n$ 输入样例 #1: ``` 7 2 1 YES NO POLL YES YES YES NO ``` 输出样例 #1: ``` 1 ``` 样例 #1 解释: 总共有7个选民,其中弃权票有3个,作废票有2个,有效选票有2个。由于选民投票意见分散,无法确定一位领导人,因此选举无效。 我们可以将2张作废票修改为支持你所支持的候选人,这样你所支持的候选人将获得3张有效选票,超过半数,成为领导人。因此修改次数为1。 输入样例 #2: ``` 3 1 0 YES NO YES ``` 输出样例 #2: ``` 0 ``` 样例 #2 解释: 总共有3个选民,其中弃权票有1个,作废票有0个,有效选票有2个。你所支持的候选人获得了2张有效选票,超过半数,成为领导人。由于选民投票意见不分散,选举有效,无需修改任何票。因此修改次数为0。 算法1: (模拟) $O(n)$ 首先计算出除作废票和弃权票之外的票数,如果有一人的得票率超过50%,则选举有效,直接输出0。 否则,需要计算出至少需要修改多少张作废票或弃权票,才能使选举有效,并且支持你所支持的候选人成为领导人。 具体来说,我们可以考虑枚举需要修改的作废票和弃权票的数量,假设需要修改 $i$ 张作废票和 $j$ 张弃权票,使得选举有效。那么,你所支持的候选人需要得到至少 $\lceil \frac{n}{2} \rceil$ 张有效选票。我们可以通过统计当前你所支持的候选人得到的有效选票数 $cnt$,以及当前已经修改的作废票和弃权票的数量 $a'$ 和 $b'$,来判断是否存在一组解 $(i, j)$,使得选举有效。 具体来说,如果当前得票数 $cnt + i \ge \lceil \frac{n}{2} \rceil$,那么选举有效,输出 $i+j$ 即可。如果 $(\lceil \frac{n}{2} \rceil - cnt) \le a' + i \le n-b'-j$,那么也存在一组解 $(i,j)$,使得选举有效,输出 $i+j$ 即可。 如果枚举完所有情况,都无法使选举有效,那么输出 -1。 时间复杂度:$O(n^2)$ C++ 代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值