牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证:
1、放进去的鱼是安全的,不会被其他鱼吃掉
2、这条鱼放进去也不能吃掉其他鱼
如果一个单词通过循环右移获得的单词,我们称这些单词都为一种循环单词。 例如:picture 和 turepic 就是属于同一种循环单词。 现在给出n个单词,需要统计这个n个单词中有多少种循环单词。
DNA分子是以4种脱氧核苷酸为单位连接而成的长链,这4种脱氧核苷酸分别含有A,T,C,G四种碱基。碱基互补配对原则:A和T是配对的,C和G是配对的。如果两条碱基链长度是相同的并且每个位置的碱基是配对的,那么他们就可以配对合成为DNA的双螺旋结构。现在给出两条碱基链,允许在其中一条上做替换操作:把序列上的某个位置的碱基更换为另外一种碱基。问最少需要多少次让两条碱基链配对成功
牛牛的好朋友羊羊在纸上写了n+1个整数,羊羊接着抹除掉了一个整数,给牛牛猜他抹除掉的数字是什么。牛牛知道羊羊写的整数神排序之后是一串连续的正整数,牛牛现在要猜出所有可能是抹除掉的整数。例如:
10 7 12 8 11 那么抹除掉的整数只可能是9
5 6 7 8 那么抹除掉的整数可能是4也可能是9
如果一个数字能表示为p^q(^表示幂运算)且p为一个素数,q为大于1的正整数就称这个数叫做超级素数幂。现在给出一个正整数n,如果n是一个超级素数幂需要找出对应的p,q。
给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N。答案可能有多个,我我们需要找出长度最小的那个。
例如 N = 18 L = 2:
5 + 6 + 7 = 18
3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7
牛牛新买了一本算法书,算法书一共有n页,页码从1到n。牛牛于是想了一个算法题目:在这本算法书页码中0~9每个数字分别出现了多少次?
牛牛正在挑战一款名为01翻转的游戏。游戏初始有A个0,B个1,牛牛的目标就是把所有的值都变为1,每次操作牛牛可以任意选择恰好K个数字,并将这K个数字的值进行翻转(0变为1,1变为0)。牛牛如果使用最少的操作次数完成这个游戏就可以获得奖品,牛牛想知道最少的操作次数是多少?
例如:A = 4 B = 0 K = 3
0000 -> 1110 -> 1001 -> 0100 -> 1111
需要的最少操作次数为4
1、放进去的鱼是安全的,不会被其他鱼吃掉
2、这条鱼放进去也不能吃掉其他鱼
鱼缸里面已经存在的鱼已经相处了很久,不考虑他们互相捕食。现在知道新放入鱼的大小范围[minSize,maxSize](考虑鱼的大小都是整数表示),牛牛想知道有多少种大小的鱼可以放入这个鱼缸。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int minSize, maxSize, n, fishsize, count = 0;
int size[1001] = { 0 };
cin >> minSize >> maxSize >> n;
if(minSize>=1 && minSize<=1000 && maxSize>=1 && maxSize<=1000 && minSize<=maxSize)
{
for (int i = 1; i <= n; i++)
{
cin >> fishsize;
if(fishsize>=1 && fishsize <=1000)
{
for (int j = 2 * fishsize; j <= maxSize && j <= 10 * fishsize; j++)
size[j] = 1;
for (int j = fishsize / 2; j >= minSize && j >= ceil(fishsize / 10.0); j--)
size[j] = 1;
}
else
{
cout<<"input error"<<endl;
return 0;
}
}
for (int i = minSize; i <= maxSize; i++)
if (size[i] == 0)
count++;
cout << count;
}
else
{
cout<<"input error!!!"<<endl;
}
return 0;
}
如果一个单词通过循环右移获得的单词,我们称这些单词都为一种循环单词。 例如:picture 和 turepic 就是属于同一种循环单词。 现在给出n个单词,需要统计这个n个单词中有多少种循环单词。
#include<iostream>
#include <string>
using namespace std;
int main(){
int count=1, n;
cin>>n;
string S[50],S_new[50];
for(int i=0;i<n;i++) cin>>S[i];
S_new[0]=S[0]+S[0];
if(n==0) {
cout<<0;
return 0;
}
for(int i=1;i<n;i++){
bool flag=false;
for(int j=0;j<count;j++){
if((S_new[j].find(S[i]) != S_new[j].npos)&&(S_new[j].length()/2==S[i].length()))
flag=true;
}
if(!flag){
S_new[count]=S[i]+S[i];
count++;
}
}
cout<<count;
return 0;
}
DNA分子是以4种脱氧核苷酸为单位连接而成的长链,这4种脱氧核苷酸分别含有A,T,C,G四种碱基。碱基互补配对原则:A和T是配对的,C和G是配对的。如果两条碱基链长度是相同的并且每个位置的碱基是配对的,那么他们就可以配对合成为DNA的双螺旋结构。现在给出两条碱基链,允许在其中一条上做替换操作:把序列上的某个位置的碱基更换为另外一种碱基。问最少需要多少次让两条碱基链配对成功
#include <iostream>
#include <string>
using namespace std;
int main(){
string st1;
string st2;
cin>>st1;
cin>>st2;
int len,ans;
len=st1.length();
ans=0;
for(int i=0;i<len;i++){
int a=st1[i];
int b=st2[i];
if((a+b)!=149 && (a+b)!=138)
ans++;
}
printf("%d\n",ans);
return 0;
}
牛牛的好朋友羊羊在纸上写了n+1个整数,羊羊接着抹除掉了一个整数,给牛牛猜他抹除掉的数字是什么。牛牛知道羊羊写的整数神排序之后是一串连续的正整数,牛牛现在要猜出所有可能是抹除掉的整数。例如:
10 7 12 8 11 那么抹除掉的整数只可能是9
5 6 7 8 那么抹除掉的整数可能是4也可能是9
#include <iostream>
using namespace std;
int main(){
int n,a,min,max,b;
long long sum=0;
scanf("%d",&n);
min=max=0;
for(int i=1;i<=n;i++){
scanf("%d",&a);
sum+=a;
if(min==0 &&max==0)
min=max=a;
if(min>a)
min=a;
if(max<a)
max=a;
}
b=((min+max)*(max-min+1))/2-sum;
if(b==0){
if(min>1)
printf("%d ",min-1);
printf("%d\n",max+1);
return 0;
}
else if(b>min && b<max){
printf("%d\n",b);
return 0;
}
printf("mistake\n");
return 0;
}
如果一个数字能表示为p^q(^表示幂运算)且p为一个素数,q为大于1的正整数就称这个数叫做超级素数幂。现在给出一个正整数n,如果n是一个超级素数幂需要找出对应的p,q。
#include <iostream>
#include <cmath>
using namespace std;
bool su(long long x){
long long n= sqrt((double)x);
for(int i=2;i<=n;i++){
if(x%i==0)
return false;
}
return true;
}
int main(){
long long a;
long long b;
cin>>a;
for(int i=2;i<=sqrt((double)a);i++){
b = pow(a,1.0/(double)i);
if((a-pow(b,(double)i))==0 && su(b)){
cout<<b<<" "<<i<<endl;
return 0;
}
}
printf("No\n");
return 0;
}
给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N。答案可能有多个,我我们需要找出长度最小的那个。
例如 N = 18 L = 2:
5 + 6 + 7 = 18
3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7
#include <iostream>
using namespace std;
int main(){
int n,l,mind;
scanf("%d%d",&n,&l);
for(int i=l;i<=100;i++){
if((2*n-i*i+i)%(2*i)==0 && (2*n-i*i+i)>=0){
int x=(2*n-i*i+i)/(2*i);
for(int j=0;j<i-1;j++)
printf("%d ",x+j);
printf("%d",x+i-1);
return 0;
}
}
printf("No");
return 0;
}
牛牛新买了一本算法书,算法书一共有n页,页码从1到n。牛牛于是想了一个算法题目:在这本算法书页码中0~9每个数字分别出现了多少次?
#include <iostream>
#include <string>
#include <sstream>
#include <math.h>
using namespace std;
string st;
int len;
double find(int x){
double sum=0;
char s[2];
sprintf(s,"%d",x);
int a,b,c;
for(int i=0;i<len;i++){
c=0;
if(i==0){
a=0;
}
else{
istringstream s1;
s1.str(st.substr(0,i));
s1>>a;
}
if(st[i]>s[0]){
a++;
}
if(s[0]=='0'){
a--;
}
if(st[i]==s[0]){
istringstream s2;
s2.str(st.substr(i+1,len));
s2>>c;
c++;
}
b=len-i-1;
//cout<<"yuan="<<sum<<"jia="<<(a-1)*pow(10.0,b)+c<<"a="<<a<<"b="<<b<<"c="<<c<<endl;
sum=sum+(a*pow(10.0,b))+c;
}
return sum;
}
int main(){
cin>>st;
len=st.length();
double ans;
ans=find(0);
printf("%.0lf",ans);
for(int i=1;i<=9;i++){
ans=find(i);
printf(" %.0lf",ans);
}
return 0;
}
牛牛正在挑战一款名为01翻转的游戏。游戏初始有A个0,B个1,牛牛的目标就是把所有的值都变为1,每次操作牛牛可以任意选择恰好K个数字,并将这K个数字的值进行翻转(0变为1,1变为0)。牛牛如果使用最少的操作次数完成这个游戏就可以获得奖品,牛牛想知道最少的操作次数是多少?
例如:A = 4 B = 0 K = 3
0000 -> 1110 -> 1001 -> 0100 -> 1111
需要的最少操作次数为4
#include <iostream>
#include <queue>
using namespace std;
struct node{
int x,y,p;
node(int a,int b,int c):x(a),y(b),p(c){};
};
queue<node> fk;
int ft[100005]={0};
int k;
int BFS(){
int a,b;
while(!fk.empty()){
node fn=fk.front();
fk.pop();
while(fn.x>=k){
fn.p+=fn.x/k;
fn.x=fn.x%k;
}
if(fn.x==0){
return fn.p;
}
if((k+fn.x)%2==0 && fn.p>0 && fn.y>=2*k-(fn.x+k)/2)
return fn.p+1;
for(int i=1;i<=fn.x;i++){
if((fn.y+i)>=k){
a=fn.x+k-i-i;
b=fn.y-k+i+i;
if(a==0)
return fn.p+1;
if(ft[a]==0){
ft[a]=fn.p+1;
node fs(a,b,fn.p+1);
fk.push(fs);
}
}
}
}
return -1;
}
int main(){
int a,b,minp;
scanf("%d%d%d",&a,&b,&k);
if(a==0){
printf("0\n");
return 0;
}
int sum=a+b;
int ans=0;
while(a>=k){
ans+=a/k;
a=a%k;
}
if(a==0){
printf("%d\n",ans);
return 0;
}
node tmp(a,sum-a,ans);
fk.push(tmp);
ft[a]=ans;
minp=BFS();
printf("%d\n",minp);
return 0;
}