OJ某些代码

问题1:敢敢单单的斐波那契数列

Description
大家都知道斐波那契数列吧!它的定义是这样的:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n−1)+F(n−2) (n≥3,n∈N∗)。
这题的题意也很简单,给你一个正整数n(1≤n≤107),让你输出斐波那契数列的第n项~由于答案较大,所以输出答案对109+7取模后的数。

Input
多组读入,保证不超过10组,每组一个正整数n(1≤n≤107)。

Output
斐波那契数列的第n项,答案对109+7取模。

Samples
Input Copy
1
Output
1
Hint
请留意本题使用空间限制。

#pragma GCC optomize(2)
#pragma G++ optimize(2)
#include
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e7+7;
int s[maxn];
int main()
{
     
   ll n,i;
   s[1]=s[2]=1;
   for(i=3;i<=maxn;i++)
   {
     
      s[i]=(s[i-1]+s[i-2])%mod;
   }
   while(cin>>n)
   {
     
      cout<<s[n]%mod<<endl;
   }
   return 0;
}

注意本题用递归解决会超时,所以可以选择打表做(即先将所有结果先算出来,用数组进行存储)。

问题2:HJ又种花啦

Description
HJGG现在有一个大小为 n(米)*m(米)的矩形花园。

由于HJGG有强迫症,所以这片花园被划分n∗m个为1*1(平方米)的方格。

现在,HJ想在这片花园上种好多种花,并且他想要相邻的格子上种不同的花~(解释:相邻指的是上下左右四个方向相邻)

添加解释。相邻的格子上种不同的花指的是:一个位置和他上下左右四个方向位置的颜色不同,对于上下左右这四个位置,是可以相同的。
由于HJ被集训队小可爱蕾酱缠着不能脱身,所以想要你来帮帮他~
如果可以满足HJ哥哥的要求,就告诉他“Beautiful flowers!”,如果不可以就告诉他“Oh! My poor HJ!”(输出均不含双引号)
谁让大家都不能拒绝蕾蕾呢!

Input
输入仅一行三个整数n,m,k(1≤n,m,k≤105),分别表示HJGG花园的长和宽,HJGG拥有的花的种类数

Output
输出一行你要告诉Hj的话~

Samples
Input Copy
1 3 5
Output
Beautiful flowers!

#include
using namespace std;
typedef long long ll;
const int maxn=1e5+9;
int a[1011][1011];
int main()
{
     
	int n,m,k;
	cin>>n>>m>>k;
	if((n+m==2)&&(k==1)||k>=2)
	cout<<"Beautiful flowers!"<<endl;
	else
	cout<<"Oh! My poor HJ!"<<endl;
   return 0;
}

因为本题说,一个位置和他上下左右四个方向位置的颜色不同,对于上下左右这四个位置,是可以相同的,所以可以知道当k>=2的时候任何情况都是满足情况的,但是需要特判一种情况就是当n1&&m1时,k=1也是满足的。

问题3: 川川教练的困惑

Description
在SMU算法竞赛团队中,谁的地位最高呢?答案是毋庸置疑的——大家发自内心爱戴的川川教练。川川教练对队内事务都非常上心,队员们的需求都尽量满足,队员们的问题也都尽快解决。但是最近川川总感觉力不从心,什么都要自己做实在是太累了!所以他需要你的帮助,这样他就可以有更多的时间和精力去和领导斗智斗勇,去为团队争取更多经费。最近,川川教练需要在新加入的集训队员中,挑选出一支最强的队伍去参加大学生程序设计竞赛。

川川之前太忙了,并不了解新的集训队员,只能根据HJ提供的队员能力值来筛选队员了。我们的大原则就是强强联手。具体的,新的集训队员一共n个人,HJ会为你提供每个人的编程能力值w。你需要找到编程能力值之和最大的**三个人****,输出他们的编程能力值之和。特别的,如果找不到一个队伍的编程能力值之和大于m,则输出"Waiver!"。

Input
第一行输入一个整数n,一个整数m,中间用空格隔开。
第二行输入n个整数wi代表编程能力值。
保证所有数据:
3≤n≤100
0≤m≤300
−100≤wi≤100
Output
如果任意组合,都无法使得队伍的英语能力值之和大于m,输出一行字符串:“Waiver!”(不含引号)

否则输出一个整数,表示在满足队伍英语能力值之和大于m的情况下能组成的最大编程能力值。

Samples
Input Copy
4 100
50 50 55 -5
Output
155
Hint

  1. 样例1说明
    我们选择前三个人,编程能力为155满足要求,同时也能获得最大的编程能力和。
  2. 样例2说明
    怎么选也满足不了要求,Waiver!
  3. 注意:编程能力可能为负数哦,这也是可以理解的。
#include
using namespace std;
typedef long long ll;
const int maxn=1e5+9;
int a[1011];
int cmp(int a,int b)
{
     
   return a>b;
}
int main()
{
     
	ll n,m,i,k;
	cin>>n>>m;
	for(i=0;i<n;i++)
	{
     
	   cin>>a[i];
	}
	sort(a,a+n,cmp);
	k=a[0]+a[1]+a[2];
	if(k>m)
	cout<<k<<endl;
	else
	cout<<"Waiver!"<<endl;
   return 0;
}

直接sort排序,输出前三个即可。

问题4:kth的自拍照

Description
kth特别喜欢自拍,但是她的手机被zyj摔在地上后,前置摄像头坏了,不管拍什么照片都是逆时针旋转了90°,而且照片都还是黑白的.这样的照片怎么能让kth找到对象呢?
现在kth向聪明的你求助,写一个程序帮助kth把图像旋转回来.(她手机太垃圾了,不带图片旋转功能).
因为照片是黑白的.所以对于手机屏幕来说,只有白色和黑色2种情况.
现在给你图片(通过01矩阵表示),对该图片进行旋转.使得图片显示正常.

Input
给你n∗n的矩阵且矩阵元素只有0和1,对矩阵实现旋转操作,使得图片恢复正常.
2≤n≤1000

Output
输出旋转之后的矩阵.矩阵每个元素间隔一个空格.

Samples
Input Copy
2
0 1
1 0
Output
1 0
0 1
Hint
考虑一下旋转的方向.

#include
using namespace std;
typedef long long ll;
const int maxn=1e5+9;
int a[1011][1011];
int main()
{
     
	ll n,i,j;
	cin>>n;
	for(i=0;i<n;i++)
	{
     
	   for(j=0;j<n;j++)
	   {
     
	     cin>>a[i][j];
	   }
	}
	for(i=0;i<n;i++)
	{
     
	   for(j=n-1;j>=0;j--)
	   {
     
	      if(j==n-1)
	         cout<<a[j][i];
	      else
	         cout<<" "<<a[j][i];
	   }
	   putchar('\n');
	}
   return 0;
}

问题5:We are singers

Description
在简谱中,音符是记录音的高低和长短的符号。而用来表示这些音的高低的符号,是用七个阿拉伯数字作为标记,它们的写法是:1、2、3、4、5、6、7,读法为:do、re、mi、fa、sol、la、si。现在给你一段由N个音符构成的简谱,以及唱出来的读音(长度小于10的字符串)的记录,请你判断总共唱错了几个读音。

Input
第一行输入一个整数N( 0 第二行包含N个数字构成的简谱,数字间用空格隔开;
第三行包含N个读音,读音间用空格隔开.

Output
总共唱错的读音个数.

Samples
Input Copy
8
1 2 3 4 5 6 7 1
do re mi fa sol la si der
Output
1

#pragma GCC optomize(2)
#pragma G++ optimize(2)
#include
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e7+7;
int a[maxn];
map<int,string> p;
vector<int> q;
void init()
{
     
   p[1]="do",p[2]="re",p[3]="mi",p[4]="fa",p[5]="sol",p[6]="la",p[7]="si";
}

int main()
{
     
	init();
	int n,i,sum=0;
	string s;
	cin>>n;
	q.resize(n);
	for(i=0;i<n;i++)
	{
     
		cin>>q[i];
	}
    for(i=0;i<n;i++)
    {
     
       cin>>s;
       if(s==p[q[i]])
       continue;
       else
       sum++;
	}
	cout<<sum<<endl;
   return 0;
}

本题涉及stl相关知识点,目前正在studying

问题6:Incompetent Fury of a Single Dog

Description
SMU的英文全称是Southwest Minzu University,中文名叫做西南民族大学。这所大学因为男女比例约为2比8,因此又被大家戏称为稀男民族大学,又因为民族同学们,通常能歌善舞,且校内的舞蹈、唱歌活动非常之多,所以被戏称为稀男歌舞大学。
在计算机学院中,男同学的比例远高于其余学院,所以计算机学院的脱单率遥遥领先。但在计算机学院的算法竞赛团队中,却出现了诡异的一个现象:某一届的集训队员,竟然全都是SingleDog。他们非常讨厌被人私下嘲笑为SingleDog。最初,如果听到或者看到SingleDog这个字眼,他们就会失去理智,慢慢的,他们只要看到情侣出现,就抑制不住心中的愤怒。现在情况更加严重了!他们只要看到成双成对的东西,都会开始无能狂怒。现在有一份集训队的通知文件,必须要发到群里,为了让他们心平气和的看完这份文件,只能精简一些文字了。具体的精简策略:集训队的通知文件是一堆小写字母,为了使这些字母不要成双成对的出现,我们只保留每种字母出现的第一个就好。

Input
第一行输入一个n,代表集训队的通知文件的长度。
第二行输入一个字符串s,代表集训队的通知文件。
保证对于所有数据: 1≤n≤1000, 字符串s中,只包含a ~ z 的小写字母。

Output
第一行输出处理后的通知文件长度。

第二行输出处理后的集训队通知文件。

Samples
Input Copy
18
woyexiangtanlianai
Output
11
woyexiangtl

#pragma GCC optomize(2)
#pragma G++ optimize(2)
#include
#include 
#include 
using namespace std;
typedef long long ll;
const int maxn=1e5+9;
const int N=1e9+7;
char a[1010];
char flag[1010];
int main()
{
     
   int i,j,sum=0,n;
   cin>>n;
   cin>>a;
   for(i=0;i<n;i++)
   {
     
      for(j=i+1;j<n;j++)
      {
     
        if(a[i]==a[j]){
     
        	flag[j]=1;
		}
	  }
   }
   for(i=0;i<n;i++)
   {
     
      if(flag[i]!=1)
      sum++;
   }
   cout<<sum<<endl;
   for(i=0;i<n;i++)
   {
     
      if(flag[i]!=1)
      cout<<a[i];
   }
   return 0;
}

就是将数组扫一遍,然后比较一下,用flag数组标记一下。

你可能感兴趣的:(c++,算法)