题目链接:http://www.patest.cn/contests/mooc-ds
【打印沙漏】
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int num[1000];
int main(){
num[1]=1;
int sum=0;
int tmp=1;
for(int i=1;i<32;i++){
num[i+1]=num[i]+2*(2*(i+1)-1); //找到规律,将所有<span style="font-family:Microsoft YaHei;">形状沙漏所需要的点存起来</span>
}
int n;
char ch;
cin>>n>>ch;
int ans=0,now;
for(int i=1;i<32;i++){
if(n>=num[i]&&n<num[i+1]){
ans=n-num[i];
now=i;
break;
}
}
for(int i=0;i<now;i++){
for(int j=0;j<i;j++)
printf(" ");
for(int j=0;j<now*2-1-i*2;j++)
printf("%c",ch);
//for(int j=0;j<i;j++) //<span style="font-family:Microsoft YaHei;"> 并不需要输出的多余的空格 , 输出就错了</span>
//printf(" ");
printf("\n");
}
for(int i=0;i<now-1;i++){
for(int j=i+1;j<now-1;j++)
printf(" ");
for(int j=0;j<3-(i*-2);j++)
printf("%c",ch);
// for(int j=i+1;j<now-1;j++)
// printf(" ");
printf("\n");
}
cout<<ans<<endl;
return 0;
}
【素数对猜想】
#include <iostream>
using namespace std;
int prime[100010];
int num[100010];
int main(){
int cnt=0;
int n;
cin>>n;
for(int i=2;i<=n;i++){ //筛选素数
if(!prime[i]){
num[cnt++]=i;
for(int j=i*2;j<n;j+=i){
prime[j]=1;
}
}
}
int ans=0;
for(int i=1;i<cnt;i++){
if(num[i]-num[i-1]==2){
ans++;
}
}
cout<<ans<<endl;
return 0;
}
【数组元素循环右移问题】
#include <iostream>
using namespace std;
int num[110];
int main(){
int n,m;
cin>>n>>m;
if(m>n) //<span style="font-family:Microsoft YaHei;">特殊情况,右移的距离大于数组本身的长度</span>,取余即可,因为<span style="font-family:Microsoft YaHei;">右移本身距离数组不变</span>
m=m%n;
for(int i=0;i<n;i++)
cin>>num[i];
int sign=0;
for(int i=n-m;i<n;i++){
if(i!=n-m)
cout<<" ";
cout<<num[i];
sign=1;
}
for(int i=0;i<n-m;i++){
if(sign){
cout<<" "<<num[i];
}
else{
if(i!=0)
cout<<" ";
cout<<num[i];
}
}
cout<<endl;
return 0;
}
【Have fun with numbers】
#include <iostream>
#include <algorithm>
using namespace std;
int numb[23];
int numc[23];
int numd[23];
int main(){
string num;
cin>>num;
int len=num.length();
for(int i=len-1;i>=0;i--){
numb[len-i-1]=num[i]-'0';
numc[len-i-1]=num[i]-'0'; //因为要将*2 变成 相加,所以用2个数组同时<span style="font-family:Microsoft YaHei;">存</span>,<span style="font-family:Microsoft YaHei;">以便后面进位</span>
}
int sign=len;
for(int i=0;i<len;i++){
int sum=numb[i]+numc[i];
if(sum>9){
numb[i]=sum-10; <span style="font-family:Microsoft YaHei;">//进位</span>
if(i==len-1){
sign=len+1;
}
numb[i+1]+=1;
}
else {
numb[i]=sum;
}
}
if(sign==len+1){ //如果出现<span style="font-family:Microsoft YaHei;">多进了一位,则不可能与之前的相同,至少多了一个元素</span>
cout<<"No"<<endl;
for(int i=len;i>=0;i--)
cout<<numb[i];
cout<<endl;
}
else{
for(int i=0;i<sign;i++){
numd[i]=numb[i]; //因为后面排序,所以先将改变完的数组存起来
}
sort(numb,numb+len);
sort(numc,numc+len);
int flag=0;
for(int i=0;i<sign;i++){
if(numb[i]!=numc[i]){
flag=1;break; //排序后一一对比
}
}
if(flag){
cout<<"No"<<endl;
}
else cout<<"Yes"<<endl;
for(int i=sign-1;i>=0;i--)
cout<<numd[i];
cout<<endl;
}
return 0;
}
【复杂度,最大子列和问题1】
O(n)方法,用c++输入方法21ms,c语言 9ms
#include<cstdio>
using namespace std;
const int maxn= 100000;
int main(){
int n;
scanf("%d",&n);
int thisSum,Max;
thisSum=Max=0;
int now;
for(int i=0;i<n;i++){
scanf("%d",&now);
thisSum+=now;
if(thisSum>Max)
Max=thisSum;
if(thisSum<0)
thisSum=0;
}
printf("%d\n",Max);
return 0;
}
【复杂度2,Maximum Subsequence Sum】
题目较坑,要考虑 全是 负数,全是0 ,既有负数又有零的情况
#include<cstdio>
using namespace std;
typedef long long ll;
const long long maxn= 100000+10;
int main(){
ll n;
scanf("%lld",&n);
ll thisSum,Max;
thisSum=Max=0;
ll st,stx,end;
ll now;
ll sign=0;
ll start_i,end_i;
ll flag=1;
ll flag2=1;
for(ll i=0;i<n;i++){
scanf("%lld",&now);
if(now>=0) flag=0;
if(!flag){
if(now>0)
flag2=0;
}
if(i==0)
{
st=now;end=now;stx=now;
start_i=now;
}
if(i==n-1){
end_i=now;
}
thisSum+=now;
if(sign&&thisSum>0){
stx=now;
sign=0;
}
if(thisSum>Max){
Max=thisSum;
end=now;
st=stx;
}
if(thisSum<0){
thisSum=0;
sign=1;
}
}
if(Max==0&&flag)
printf("%lld %lld %lld\n",Max,start_i,end_i);
else if(!flag&&flag2)
printf("0 0 0\n");
else
printf("%lld %lld %lld\n",Max,st,end);
return 0;
}