Codeforces Round #553 (Div. 2)
A. Maxim and Biology
题意:
给出一个串s,问最少需要多少步操作使得串s包含"ACTG"这个子串,输出最少操作次数;
题解:
枚举每个位置 i,求出将 i,i+1,i+2,i+3 变为 "ACTG" 所需的最少操作次数即可;
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a)) int n;
char s[]; int Step(char x1,char x2)//求解x1变为x2所需的最少操作步骤
{
if(x1 <= x2)
return min(x2-x1,x1-'A'+'Z'-x2+);
else
return min(x1-x2,'Z'-x1+x2-'A'+);
}
//求解以index位置开始使得其连续的四个字符变为"ACTG"所需的最小操作步骤
int F(int index)
{
int ans=;
ans += Step(s[index],'A');
ans += Step(s[index+],'C');
ans += Step(s[index+],'T');
ans += Step(s[index+],'G');
return ans;
}
int Solve()
{
int ans=INF;
int len=strlen(s);
for(int i=;i+ <= len;++i)
ans=min(ans,F(i));
return ans;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
while(~scanf("%d",&n))
{
scanf("%s",s);
printf("%d\n",Solve());
}
return ;
}
B. Dima and a Bad XOR
题意:
给出一个 n*m 的矩阵a[][],每一行任选一个元素,判断选出的这 n 个元素的异或和是否大于0;
如果存在大于0的选法,输出 "TAK" ,并且输出每一行选择的元素的列标;
如果不存在,输出 "NIE";
题解:
令 ans = a[1][1]^a[2][1]^........^a[n][1];
①ans > 0 : 输出 n 个 1
②ans == 0 : 判断是否可以将a[1][1] 或 a[2][1] 或 ..... 或 a[n][1] 变成同一行的其他元素;
如果可以,输出 "TAK",并将任意一个a[ i ][1]变为同行中的其他元素;
反之,输出"NIE";
AC代码:
#include<bits/stdc++.h>
using namespace std; int n,m;
int a[][];
int tmp[]; bool isSat()//判断是否存在去重后的元素个数 > 1 的行
{
for(int i=;i <= n;++i)
{
/**
如果想要从tmp[1]位置作为起始位置,第一个参数为tmp+1
a[i]数组第一个位置的下标为a[i][1],所以第二个参数为a[i]+1
第三个参数不是指数组个数,而是指要复制的数据的总字节数长度
*/
memcpy(tmp+,a[i]+,m*sizeof(int));//将a[i]数组拷贝给tmp数组
sort(tmp+,tmp+m+);
int t=unique(tmp+,tmp+m+)-tmp;//去重
t--;
if(t > )
return true;
}
return false;
}
void Solve()
{
int ans=;
for(int i=;i <= n;++i)
ans ^= a[i][]; if(ans != || ans == && isSat())
{
printf("TAK\n");
bool flag=(ans != );//如果ans != 0,输出n个1
for(int i=;i <= n;++i)
{
if(!flag)
{
for(int j=;j <= m;++j)
if(a[i][j] != a[i][])
{
flag=true;//如果ans=0,找到第一个相异与a[i][1]的元素的列标即可
printf("%d ",j);
break;//记得break,不然,printf("%d ",j) 可能会调用多次
}
if(!flag)
printf("1 ");
}
else
printf("1 ");
}
printf("\n");
}
else
printf("NIE\n");
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=;i <= n;++i)
for(int j=;j <= m;++j)
scanf("%d",a[i]+j);
Solve();
}
return ;
}
C. Problem for Nazar
题意:
给定奇数集和偶数集;
现构造一个数组:
先取奇数集中 20 个元素1,再取偶数集中 21 个元素2,4;
再取奇数集中 22素 {3,5,7,9},再取偶数集中 23 个元素 {6,8,10……};
............
得到 {1,2,4,3,5,7,9,6,8,10,12……} ;
问这个数组的某一区间 [l,r] 的区间和是多少,并对1e9+7取模。
思路一:
分别求出区间[l,r]对应的 {oddS,oddE},{evenS,evenE}
oddS:区间[l,r]的第一个奇数
oddE:区间[l,r]的最后一个奇数
evenS,evenE同理;
(oddSum:{oddS,....,oddE}之间的奇数个数,evenSum同理)
最后输出ans%mod即可;
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+; ll l,r; ll fOdd(int x)///找2^x个连续的奇数开始的奇数
{
ll tot=((1ll*<<x)-)/;
return +(tot<<);
}
ll fEven(int x)///找2^x个连续的偶数开始的偶数
{
ll tot=((1ll*<<x)-)/;
return +(tot<<);
}
ll quickPower(ll _a,ll _b,ll _mod)
{
ll ans=;
while(_b)
{
if(_b&)
ans=ans*_a%mod;
_a=(_a*_a)%mod;
_b >>= ;
}
return ans;
}
ll Solve()
{
int x,y;
for(x=;(1ll*<<(x+))- < l;++x);///包含l的最大的x
for(y=;(1ll*<<(y+))- < r;++y);///包含r的最大的y ll oddS=!(x&)/**判断x是否为偶数*/ ? fOdd(x)+(l-(1ll*<<x))*:fOdd(x+);
ll evenS=(x&)/**判断x是否为奇数*/ ? fEven(x)+(l-(1ll*<<x))*:fEven(x+); ll oddE=!(y&) ? fOdd(y)+(r-(1ll*<<y))*:fOdd(y+)-;
ll evenE=(y&) ? fEven(y)+(r-(1ll*<<y))*:fEven(y+)-; ll ans=;
if(oddE >= oddS)
{
ll n=((oddE-oddS)>>)+;
ll d=oddE+oddS;
///被除数2可以将其约掉(d肯定为偶数)
///也可以用逆元进行除法取模
///我用的是逆元除法取模(有点麻烦)
ans += ((n%mod)*(d%mod)%mod)*(quickPower(,mod-,mod))%mod;
}
if(evenE >= evenS)
{
ll n=((evenE-evenS)>>)+;
ll d=evenE+evenS;
ans += ((n%mod)*(d%mod)%mod)*(quickPower(,mod-,mod))%mod;
}
return ans%mod;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
scanf("%lld%lld",&l,&r);
printf("%lld\n",Solve());
return ;
}
思路二:
前 i 个偶数的和为 i*(i+1)
前 i 个奇数的和为 i*i
求解出前 r 个奇数,偶数个数,求出答案
求解出前 l-1 个奇数,偶数个数,求出答案,两者做差便是最终答案
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+; ll l,r; ll Solve(ll x)///分别求解出[1,x]中奇数个数,偶数个数
{
ll oddSum=;
ll evenSum=;
for(int i=;;i++)
{
if((1ll*<<(i+))- >= x)///包含x的最大的2^i
{
if(i&)
evenSum += (x-(1ll*<<i)+)%mod;
else
oddSum += (x-(1ll*<<i)+)%mod;
break;
}
if(i&)
evenSum += (1ll*<<i)%mod;
else
oddSum += (1ll*<<i)%mod;
evenSum %= mod;
oddSum %= mod;
}
///[1,x]的区间和
return (evenSum%mod*(evenSum+)%mod%mod+oddSum%mod*(oddSum%mod)%mod)%mod;
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
scanf("%lld%lld",&l,&r); ///注意,取模做减法有可能变成负值,需要再加个mod,再模一次mod
printf("%lld\n",(Solve(r)-Solve(l-)+mod)%mod); return ;
}
Codeforces Round #553 (Div. 2)的更多相关文章
- Codeforces Round #553 (Div. 2) D题
题目网址:http://codeforces.com/contest/1151/problem/D 题目大意:给出n组数对,(ai , bi),调整这n组数对的位置,最小化 ∑(ai*( i -1)+ ...
- Codeforces Round #553 (Div. 2) C题
题目网址:http://codeforces.com/contest/1151/problem/C 题目大意:给定奇数集和偶数集,现构造一个数组,先取奇数集中一个元素1,再取偶数集二个元素2,4,再取 ...
- Codeforces Round #553 (Div. 2) B题
题目网址:http://codeforces.com/contest/1151/problem/B 题目大意:给定一个n*m的矩阵,问是否可以从每一行中选择一个数,使得这n个数异或大于0,如果可以还要 ...
- Codeforces Round #553 (Div. 2) A题
题目网址:http://codeforces.com/contest/1151/problem/A 题目大意:给定一个由大写字母构成的字符串和它的长度,有这样的操作,使任意一个字母变成与其相邻的字母, ...
- Codeforces Round #553 (Div. 2) C
C. Problem for Nazar time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces Round #553 (Div. 2) E 贡献
https://codeforces.com/contest/1151/problem/E 题意 一条长n的链,每个点上有值\(a[i]\),定义\(f(l,r)\)为该区间的\(值\)所代表的点留下 ...
- Codeforces Round #553 (Div. 2) C 等差数列求和 + 前缀和
https://codeforces.com/contest/1151/problem/C 题意 有两个等差数列(1,3,5,..),(2,4,6,...),两个数列轮流取1,2,4,...,\(2^ ...
- Codeforces Round #553 (Div. 2) C. Problem for Nazar 数学
题意:从奇数列 1 3 5 7 9 .... 偶数列2 4 6 8 10...分别轮流取 1 2 4 ....2^n 个数构成新数列 求新数列的区间和 (就一次询问) 思路:首先单次区间和就是一个简 ...
- Codeforces Round #553 (Div. 2) D. Stas and the Queue at the Buffet 贪心+公式转化
题意 给出n个pair (a,b) 把它放在线性序列上 1--n 上 使得 sum(a*(j-1)+b*(n-j)) 最小 思路 :对式子进行合并 同类项 有: j*(a-b)+ (-a+ ...
随机推荐
- Bootstrap -- 下拉菜单、输入框组、导航菜单
Bootstrap -- 下拉菜单.输入框组.导航菜单 1. 下拉菜单 可以使用带有各种大小按钮的下拉菜单:.btn-lg..btn-sm 或 .btn-xs. 实现下拉菜单: <!DOCTYP ...
- 英语口语练习系列-C10-up and down
<长恨歌>·白居易 长恨歌朗读视频,点我可听,thanks 长恨歌-白居易 汉皇重色思倾国,御宇多年求不得.杨家有女初长成,养在深闺人未识. 天生丽质难自弃,一朝选在君王侧.回眸一笑百媚生 ...
- 给Integer对象加锁的错误方式
package com.thread.test; public class BadLockOnInteger implements Runnable { public static Integer i ...
- [LeetCode] 12,13 整数和罗马数互转
12. 整数转罗马数字 题目链接:https://leetcode-cn.com/problems/integer-to-roman/ 题目描述: 罗马数字包含以下七种字符: I, V, X, L,C ...
- 25 python 初学(socket,socketserver)
参考blog :www.cnblogs.com/yuanchenqi/articles/5692716.html 1. sk = socket.socket() 里面有两个重要的参数,family 和 ...
- 监控redis
[4ajr@redis1 scripts]$ cat redismonitor.sh #!/bin/bash #想要什么监控项再添加 rediscli="/soft/redis/bin/re ...
- kubernete 本地持久化存储 kube-controller-manager的日志输出 + pvc pv 概念 -- storageclass 概念
1.mysql持久化存储 [root@pserver78 0415villa]# cat latestmysql.yaml |grep -v '^#' apiVersion: v1 kind: Ser ...
- go笔记-限速器(limiter)
参考: https://blog.csdn.net/wdy_yx/article/details/73849713https://www.jianshu.com/p/1ecb513f7632 http ...
- odoo后台实现微信公众号验证
在微信公众号开发的其中一个步骤是微信服务器调用我们自己的网站验证身份,这一步微信服务器会传递过来4个参数,可是按照官方的写法,却无法验证通过,下面是官方的验证方法: import hashlib im ...
- 关于toncat的Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC3986
首先这个错误通常的产生原因, 是tomcat的确收到了格式不正确的请求参数,根据tomcat的版本支持的解析,tomcat抛出这个错误. 但是还有一种就是前台发送的请求方式由 get发送导致本应pos ...