CodeForces1257总结

传送门~
A. Two Rival Students
大致题意:有n个人,分布在坐标1~n上。给出1 ~n之间特定的两个人的位置。你可以交换相邻两个人的位置,最多交换x次。题目需要求怎样使得给定两人间距离最大。
水题,贪心策略,交换一次距离增加一,最多增加n-1次
B. Minimize the Permutation
跟昨天做的题很类似,给出一串数字,尽可能的让它的字典序最小,可以通过交换相邻的两个元素来使得其字典序变小,但每个固定位置只能交换一次,需要开两个数组,一个数组记录数字,一个数组记录其是否已经交换过,直到所有元素都交换过一遍,过程中尽量将较小的数字往前放就算结束。
C. Dominated Subarray
大致题意:给你n个数,你需要从中找出一串数字,使得这串连续的数字只有1个重复元素且重复次数为二,输出其最短长度。(就是从这串数字中找出相同数字间的最小间距)
水题,但是第一次WA在第一个测试点,又是因为scanf,这已经是第n次因为scanf出错了。用两个数组,一个记录输入的数据,一个记录此数据是否出现过即可,很容易ac。
D. Yet Another Monster Killing Problem
大致题意:现有n只怪兽,每只怪兽有一个特定的攻击值,有m个英雄,每个英雄有特定的力量值和耐力值。英雄每杀死一只怪兽耐力值-1,每天都要进行杀怪兽任务,若该英雄力量值小于该怪兽的攻击值,则这一天的机会用完了,这一天无法再进行攻击,问最少几天能把怪兽杀完。
这个题侬了半天没侬出来,后来上网查了下,主要运用贪心算法,记录每个耐力值下英雄最大的战斗力。并且优先选择战斗力大的并且耐力值高的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1000005;
typedef long long ll;
ll a[N],m[N],p[N],s[N],t,n,k;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		scanf("%d",&k);
	//	for(int i=0;i<=n;i++) m[i]=0;
		for(int i=1;i<=k;i++)
		{
			scanf("%d %d",&p[i],&s[i]);
			m[s[i]]=max(m[s[i]],p[i]); 
		}
		for(int i=n;i>=0;i--) 
			m[i]=max(m[i],m[i+1]);//可以清i天的英雄,i-1天同样可以,所以我们需要找到最大战斗力值。
		int day=0;
		int f=0;
		for(int i=1;i<=n;)
		{
			if(a[i]>m[1]) //这边m[1]被上面更新成最大值了,如果怪兽战斗力>英雄战斗力,则输出-1
			{
				f=1;
				cout<<"-1"<<endl;
				break;
			}
			int j=0;
			int maxn=0;
			for(;j<=n;j++)
			{
				maxn=max(maxn,a[j+i]);
				if(m[j+1]<maxn) break; //因为每个英雄可以无限次使用
			}
			day++;
			i+=j;
		}
		if(f==0) 
		cout<<day<<endl;
			for(int i=0;i<=n;i++) m[i]=0;
	}
}

E. The Contest
大致题意:共三个集合,k1个元素在第一个集合,k2个元素在第二个集合,k3个元素在第三个集合,每进行操作可以使一个元素从原来的集合到任意的集合。要求使得集合1中的数最小,集合3中的数最大,剩下的数在集合2中的最小操作次数。
F. Make Them Similar
题目大意:给你一个数组a,现在让所有数都与k异或,使得得到的数组中,所有数的二进制的1的个数相同,求这个k。等我再深造深造再回来补后两个题…
今天说是做出来三个题,实际上有一个题昨天已经补过了,其实是两道,而且做出来的两个题中还有一个题是临结束了才交上的,做的非常慢,可能还是因为时间分配的不均匀吧,看过一个题后总觉得不能白看,总想把这个题想出来,结果制造了一堆没法解决的bug才肯放弃,我觉得得把这个毛病改改,不能老是死磕,一根筋。总之,明天继续加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>