话说新的一年到了 quanquan先在这里给大家拜个年
llq还是很会挑时间的 在新年的五个小时之前很给力的考了个试
虽然我考的并不是很好。。。。。。。。。。
但是没关系 再接再厉么
好了 现在大家来看一看本次考试题及题解吧
我承认我是粘的题干,,,,,不要抽我
这是一道送分题。。。按照llq的说法 会编程的都会。。。
我又成功的挂了两个点。。。。。。
没办法。。。。。
好了现在正式讨论做法
01. 首先正常人的思维绝对是用字符串做。。。。。不过有一点要注意。。就是如果在字符串上直接乘除 。。。。你有50%的几率爆掉一个char 没错 爆char
02. 不太正常的人的做法, 大家绝对不了解c++发明者的古怪的心思.。。你敢相信,,,它可以用。。。用。。。scanf("%1d",&a[i])
直接进行各位分割的读入。。。。。这个发明者真是。。。真是贴心极了
03.不管怎么样 你得拿这道水题的满分。。。。。。。。。。
下面是01的代码
using namespace std;
char str[19];
int a[19];
int sum=0;
int c[19]={0,7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int main()
{
freopen("id.in", "r", stdin);
freopen("id.out", "w", stdout);
scanf("%s",str+1);
for(int i=1;i<=17;i++)
a[i]=str[i]-'0';
for(int i=1;i<=17;i++)
{
int tmp=a[i];
tmp*=c[i];
sum+=tmp;
}
sum%=11;
if(sum==0)
a[18]=1;
else if(sum==1)
a[18]=0;
else
a[18]=12-sum;
for(int i=1;i<=17;i++)
printf("%d",a[i]);
if(a[18]==10)
cout<<"X";
else
printf("%d",a[18]);
fclose(stdin);
fclose(stdout);
}
额 02的代码你们自己改吧 改一丢丢#include 就可以
下面是标称 你们需要 一点 时间理解
int main()
{
freopen("id.in","r",stdin);
freopen("id.out","w",stdout);
const int mo = 11;
int i, L = 17, ans = 0, e = 1;
char str[20];
gets(str);
for(i=1; (12 - ans) % mo;
str[L] = ans==10 ? 'X' : ans+'0';
puts(str);
}
莱特币(ltc)
【题目描述】 6Bit仔细检查了一下矿机,发现挖矿机虽然挖比特币有 bug,但挖莱特币还是很好使的,虽然莱特币 没有比特币值钱。换算成莱特币,矿机的成本是 Y 莱特币。 现在 6Bit推算出了,从今天往后 N 天,每天可以挖出的莱特币数,请你帮忙计算一下,6Bit最快连续 挖矿多少天可以回本,如果回不了本则输出 0.
【输入】 第一行两个整数 Y、N(表示矿机的成本为 Y,推算出 N 天的莱特币出矿数)。 第二行有 N 个整数,Ai表示第 i 天可以挖出的莱特币数。
【输出】 输出一个整数,表示如果 6Bit要回本,至少要使用矿机连续挖矿多少天。
【输入输出样例】 ltc.in ltc.out 15 10 5 1 3 5 10 7 4 9 2 8 2
【数据范围】 对于 30%的数据,N <= 500。 对于 70%的数据,N <= 104。 对于 100%的数据,1 <= Y <= 108,1 <= N <6Bit要回本,至少要使用矿机连续挖矿多少天。
【输入输出样例】 ltc.in ltc.out 15 10 5 1 3 5 10 7 4 9 2 8 2
【数据范围】 对于 30%的数据,N <= 500。 对于 70%的数据,。
1 <= i <= S。
【样例解释】 6Bit在第 4 天开始,连续采矿 2 天,收益为 5+10=15
正好回本。 在或者 6Bit也可以第 5 天开始,连续采矿 2 天,益为 10+7=17>15,回本。
这题直接体现了 一个人的智商。。。。
智商。。。。。。。
1.30分做法 暴力 立方做法。。。没什么说的 模拟就行。。。。。我才不要给这种代码
2.70分做法 前缀和数组 用前缀和的方式减少时间复杂度 代码一会给。。。
3.100 01做法 前缀和加二分 没什么说的
4.100 02做法 重点来了 尺取法 尺取法就是两个指针表示区间[l,r]的开始与结束然后根据题目来将端点移动,是一种十分有效的做法。适合连续区间的问题 本题就可以 用这种奇怪的方法
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int a[100001];
int y,n;
int main()
{
int times;
scanf("%d",×);
for(int kk=1;kk<=times;kk++)
{
memset(a,0,sizeof(a));
scanf("%d%d",&n,&y);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int ans=n+1;
long long sum=0;
for(int i=1,j=1;j<=n;j++)
{
sum+=a[j];
if(sum<=y) continue;
while(sum>=y&&i<=j)
{
sum-=a[i];
i++;
}
ans=min(ans,j-i+2);
}
if(ans>n)
cout<<'0'<<endl;
else
cout<<ans<<endl;
}
}
#include <stdio.h>
int a[100001];
int judge (int x,int y,int n);
int mul (int x);
int y,n;
int main()
{
freopen("ltc.in","r",stdin);
freopen("ltc.out","w",stdout);
scanf("%d%d",&y,&n);
long long ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ans+=a[i];
}
if(ans<y)
printf("0");
else
printf("%d",judge(1,n,y));
}
int judge (int x,int y,int n)
{
while(x<y)
{
int tmp=(x+y)/2;
if(mul(tmp))
y=tmp;
else
x=tmp+1;
}
return x;
}
int mul (int x)
{
for(int j=1;j<=n-x;j++)
{
long long sum=0;
for(int k=j;k<j+x;k++)
` sum+=a[k]; if(sum>=y) `
````````
{
return 1;
}
}
return 0;
}