问题 B: 【模拟】步步夺金

题目描述
Ivy所在的公司想推出一款手机APP“步步夺金”,该APP可以统计用户每天走路的步数,并给予相应的“金币”奖励。在用户的“金币”达到一定数量后,就可以在公司的网站上兑换一定的体育用品。
根据走路步数x奖励金币的规则如下:
1、每天的前1000步可领取0.3金币(若未达到1000步则领取数量为零),之后的每2000步能领取0.1金币。为了引导用户适量运动,每天领取的金币数量不能超过3。
2、用户只有在APP中点击“签到”才能领取当天步数对应的金币。
3、为了让用户能够每天坚持使用该APP,在用户连续三天签到后,从第四天开始,用户每天“签到”时领取的金币数可以在原金币计算方法的基础上乘以2(当然前提是在第四天时用户也点击“签到”,并且领的金币最多不能超过6)。但之后只要有一天中断点击“签到”,则又要重新连续签到三天,在第四天时才能继续获得金币加倍的优惠。
Ivy的任务是,根据用户每天所走步数以及签到的情况,统计用户n天后所拥有的金币总数。请帮助Ivy设计这个程序。
输入
输入共有n+1行,第一行包含一个正整数n,表示需要统计该用户n天后的金币总数。接下来有n(1<=n<=100)行,每行两个正整数,xi(1<=xi<=100000)和fi(1或0),分别表示第i天时用户所走的步数以及当天该用户是否进行了签到。fi为0表示用户当天未点击“签到”,为1表示用户当天点击“签到”。
输出
输出数据仅一行,表示n天后该用户所拥有的金币总数,保留一位小数。
样例输入 Copy
6
600 1
2300 1
5000 1
56000 1
80000 0
57000 1
样例输出 Copy
9.8
提示
第一天:用户走了600步,小于1000步,签到后得到0金币。
第二天:用户走了2300步,前1000步可得金币0.3;2300-1000=1300,不足2000步。所以签到后可得0.3金币。
第三天:用户走了5000步,在进行签到后,可得到的金币为:0.3+0.12=0.5。
第四天:用户走了56000步,在进行签到后,应得的金币为: 0.3+0.1
27=3。由于是连续第四天签到,所以实际得到32=6金币。
第五天:用户走了80000步,但未进行签到,所以得到的金币为0。
第六天:用户走了57000步,进行签到后,应得的金币为::0.3+0.1
28=3.1。由于每天最高获金不能超过3,所以实际得到3金币。
根据上述每天获得的金币,该用户6天后可获“金币”总数为9.8。

#include<bits/stdc++.h>

using namespace std;

 int cmp(const void*a,const void *b)
{
    return*(int  *)a-*(int    *)b;
}
typedef struct news
{
int   z,x;
float c=0;
}news;


/*bool cmp2(news a,news b)
{if(a.z==b.z)
    return a.x<b.x;
}*/

int main()
{
int  z=0,x=0,i=0,v=0,j=1,c=0,k=0,y,f=0,q=0,len,min1,min2,max1,len1,max2,len2;
    float   z1=0,z2=0,z3=0,z4=0;
    double c1=0,c2,c3;
char   p1[100]={0},p2[100],i1;
long long x1=0;
//int    *a=(int  *)malloc(100000005*sizeof(int ))
string str1,str2,str3;
int s[300][300];
int a[300][300];
memset(s,0,sizeof(s));
int n,m;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        scanf("%d",&a[i][j]);
        s[i][j]+=a[i][j];
        s[i][j]+=s[i-1][j];
        s[i][j]+=s[i][j-1];
        s[i][j]-=s[i-1][j-1];
    }
}
int maxx=-1e8;
for(i=1;i<=n;i++)
{
    for(j=0;j<i;j++)
    {
        int rec=0;
        for(int w=1;w<=m;w++)
        {
            if(s[i][w]-s[j][w]-s[i][rec]+s[j][rec]>0)
            {
                if(s[i][w]-s[j][w]-s[i][rec]+s[j][rec]>maxx)
                {
                    maxx=s[i][w]-s[j][w]-s[i][rec]+s[j][rec];
                }
            }
        else
        {
            if(s[i][w]-s[j][w]-s[i][rec]+s[j][rec]>maxx)
            {
                maxx=s[i][w]-s[j][w]-s[i][rec]+s[j][rec];
            }
            rec=w;
        }
        }
    }
}
printf("%d\n",maxx);
}
//qsort(a,z,sizeof(int),cmp);

虽然是借鉴了别人的,但我不久会能看懂的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值