【codeforces|Codeforces Global Round 10——A.B!.C】Codeforces Global Round 10
A. Omkar and Password 题意:t组输入,每组n个数,数组a,可进行操作:相邻的两个值不同,则可以相加并替换掉这相邻的两个值,问最后数组剩余的长度最小值。
思路:只要数组里有超过两个不相同的数,就是可以相加得到最后只剩一个数。否则就是全部都相同的值,直接输出n。
代码
#include
using namespace std;
int T,n;
int a[200005];
mapmp;
int main()
{
cin>>T;
while(T--)
{
mp.clear();
cin>>n;
int num=0;
for(int i=0;
i>a[i];
if(mp[a[i]]==0)
num++,mp[a[i]]++;
}
if(num>1)
printf("1\n");
else
printf("%d\n",n);
}
return 0;
}
B. Omkar and Infinity Clock 题意:t组输入,每组有n,还有一个k,接下来一行是n个数,数组a,k次操作,每次操作:用数组中最大值减去数组中每个数,替代原值,输出k此操作后的数组 。
思路:这道题的k的范围是1018次,这一看就不能直接暴力,所以用数据写一写,算一算,发现k次操作的奇数次都是一样的,偶数次都是一样的,那就直接判断k的奇偶,求出k=1次时的操作结果和k=2次时的操作结果即可。
但是真是没注意到,a数组的取值范围是-109,求最大值时,我定义的最大值的初始值是-1,唉。
代码
#include
using namespace std;
int T,n;
long long int a[200005],b[200005],c[200005];
long long int k;
mapmp;
int main()
{
cin>>T;
while(T--)
{
cin>>n>>k;
long longmaxn=-0x3f3f3f3f3f3f;
long long int minn=0x3f3f3f3f3f;
for(int i=0;
i>a[i];
minn=min(a[i],minn);
maxn=max(maxn,a[i]);
}
int num=0;
for(int i=0;
i
C. Omkar and Waterslide 题意:将给定的数组a,变成非递减序列的最少步骤。
思路:一起的都是递增的一个需要加的子序列或者递减的需要加的子序列,然后加最大的差距的差值。但是如果中间有突然增的就不好处理。于是就可以发现,如果数组与前面的值的差值是负数,那此负数的绝对值就是需要加的值,(如果是正数,那退回去想就是,随着上一个负数时跟着一起加的满足了),所以算出所有与前一位的值的差值,若是负数,就是需要操作,加上改负数的绝对值。
代码
#include
using namespace std;
int T,n;
int a[200005],b[200005];
long long int num;
mapmp;
int main()
{
cin>>T;
while(T--)
{
cin>>n;
for(int i=0;
i>a[i];
b[0]=0;
num=0;
for(int i=1;
i
推荐阅读
- 每日一题|每日一题-解码(第十一届蓝桥杯)(简单思维)
- codeforces B. Young Explorers
- codeforces C. Mere Array
- codeforces D. Omkar and Bed Wars
- codeforces C. Omkar and Waterslide
- codeforces B. Omkar and Infinity Clock
- codeforces B. Ternary Sequence
- 题库-CF|【Codeforces Round 370 (Div 2) E】【线段树 等比数列 区间合并】Memory and Casinos 赌场区间[l,r] l进r先出的概率
- 题库-CF|【Codeforces Round 263 (Div 2)C】【贪心 哈弗曼思维】Appleman and Toastman 每个非1size子树延展为2子树的最大权
- Codeforces|Codeforces Round #605 (Div. 3) D. Remove One Element