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;
}