传送门~
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才肯放弃,我觉得得把这个毛病改改,不能老是死磕,一根筋。总之,明天继续加油!