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+ ...
随机推荐
- 使用sqlyog或者navicat连接mysql提示1862错误解决
mysql的bin目录下执行 mysqladmin -uroot -p password 依次输入旧密码.新密码.确认新密码 修改后重新使用sqlyog或navicat连接成功 问题解决!
- Tomcat开启SSL协议支持
一.生成keyStore 要使用ssl connector,必须先创建一个keystore.他包含了服务器中被客户端用于验证服务器的数字证书.一旦客户端接受了这个证书,客户端就可以使用public k ...
- ubuntu16.04系统深度学习开发环境、常用软件环境(如vscode、wine QQ、 360wifi驱动(第三代暂无))搭建相关资料
事后补充比较全面的(找对资料真的省一半功夫):https://www.jianshu.com/p/5b708817f5d8?from=groupmessage Ubuntu16.04 + 1080Ti ...
- VMware虚拟机系统无法使用桥接联网
1.环境 VMware 14.1.1 虚拟系统:Windows Server 2008 32位 2.解决办法 打开虚拟网络编辑器 有红框中的提示出现时,就点击更改设置 点击桥接模式,在VMnet信息中 ...
- nginx内置变量总结
nginx内置变量 2019-02-28 变量名称 变量用途 $atg_PARAMETER 客户端GET请求中 PARAMETER字段的值 ...
- About Pull Strings 英语走后门议论文
About pull strings Author : Pleiades_Antares 1. From ancient times to the present, the "going b ...
- 【笔记】Python集成开发环境——PyCharm 2018.3下载、注册、帮助文档
[博客导航] [Python导航] 前言 使用好的开发环境将有效提高编程效率,在Python使用上我是小白,所以特意请教了从事语言处理的成同学,告知我,推荐使用Pycharm和IntelliJ. 目前 ...
- formatter的使用
1.目的 如图所示,实现行编辑栏中的编辑删除,以及在时间建议中显示上中下旬 可参考easyui官方文档中所写的关于datagrid列属性:http://www.jeasyui.net/plugins/ ...
- Python简单的多线程demo:常用写法
简单多线程实现:启动50个线程,并计算执行时间. import threading import time def run(n): time.sleep(3) print("task:&qu ...
- Netty(RPC高性能之道)原理剖析
转载:http://blog.csdn.net/zhiguozhu/article/details/50517551 1,Netty简述 Netty 是一个基于 JAVA NIO 类库的异步通信框架, ...