题目链接:http://www.patest.cn/contests/mooc-ds
【打印沙漏】
#include
#include
#include
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); //找到规律,将所有形状沙漏所需要的点存起来
}
int n;
char ch;
cin>>n>>ch;
int ans=0,now;
for(int i=1;i<32;i++){
if(n>=num[i]&&n 并不需要输出的多余的空格 , 输出就错了
//printf(" ");
printf("\n");
}
for(int i=0;i
【素数对猜想】
#include
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
【数组元素循环右移问题】
#include
using namespace std;
int num[110];
int main(){
int n,m;
cin>>n>>m;
if(m>n) //特殊情况,右移的距离大于数组本身的长度,取余即可,因为右移本身距离数组不变
m=m%n;
for(int i=0;i>num[i];
int sign=0;
for(int i=n-m;i
【Have fun with numbers】
#include
#include
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个数组同时存,以便后面进位
}
int sign=len;
for(int i=0;i9){
numb[i]=sum-10; //进位
if(i==len-1){
sign=len+1;
}
numb[i+1]+=1;
}
else {
numb[i]=sum;
}
}
if(sign==len+1){ //如果出现多进了一位,则不可能与之前的相同,至少多了一个元素
cout<<"No"<=0;i--)
cout<=0;i--)
cout<
【复杂度,最大子列和问题1】
O(n)方法,用c++输入方法21ms,c语言 9ms
#include
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;iMax)
Max=thisSum;
if(thisSum<0)
thisSum=0;
}
printf("%d\n",Max);
return 0;
}
【复杂度2,Maximum Subsequence Sum】
题目较坑,要考虑 全是 负数,全是0 ,既有负数又有零的情况
#include
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=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;
}