省略简单的水题
问题 E: 冬眠
题目描述
麻雀帕西和青蛙弗洛格是好玩伴,它们经常一起比赛唱歌。但冬天来了,青蛙弗洛格冬眠了,它的睡眠深度是D。麻雀帕西觉得好无聊,于是它想办法要唤醒弗洛格。麻雀帕西只会唱N首歌,第i首歌的音量是Si。每听完一首歌,青蛙弗洛格的睡眠深度就会减少,减少的值等于它听到的歌的音量。当青蛙弗洛格的睡眠深度大于0的时候,它会继续冬眠,当睡眠深度小于或者等于0时,它就会被唤醒了。麻雀帕西会从第1首歌开始唱,唱完第1首歌后如果弗洛格还没醒就接着唱第2首歌,如果唱完第2首歌弗洛格还没醒就接着唱第3首歌,依次类推,如果唱完第N首歌后弗洛格还没醒,那么麻雀帕西又重新从第1首歌开始唱,就像循环播放音乐一样,一直到青蛙弗洛格被唤醒为止,那么麻雀帕西总共唱了多少首歌?
输入
第一行,两个整数: D 和 N。
第二行,N个整数,空格分开,第i个整数就是第i首歌的音量Si。输出
一个整数,麻雀帕西总共唱了多少首歌后,弗洛格会被唤醒?
样例输入 Copy
13 3 5 2 4样例输出 Copy
4提示
麻雀帕西唱完第1首歌后,青蛙弗洛格睡眠深度变成8,
麻雀帕西唱完第2首歌后,青蛙弗洛格睡眠深度变成6,
麻雀帕西唱完第3首歌后,青蛙弗洛格睡眠深度变成2,
麻雀帕西再次唱完第1首歌后,青蛙弗洛格睡眠深度变成-3,青蛙弗洛格会被唤醒。
对80%的数据,1 ≤ D ≤ 10000,1 ≤ N ≤ 50,1 ≤ Si ≤ 100。
另外20%的数据,1 ≤ D ≤ 2000000000,1 ≤ N ≤ 50,1 ≤ Si ≤ 3。
一开始做的时候没有考虑优化算法,一直憨憨的一个一个减,导致一直超时,淦,还好最后过了
#include<stdio.h>
int main()
{
int d,n,h=0,sum=0;
scanf("%d %d",&d,&n);
int a[n];
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
while(d>sum)
{
d-=sum;
h+=n;
}
for(int i=1;d>0;i++)
{
d-=a[i];
h++;
}
printf("%d",h);
}
问题 F: 小球
题目描述
有R个红色盒子和B个蓝色盒子,还有R个红色小球和B个蓝色小球。每个盒子只能装一个小球,每个小球都要放在一个盒子里。如果把一个红色小球放在一个红色盒子里,那么得分是C。如果把一个蓝色小球放在一个蓝色盒子里,那么得分是D。如果把一个红色小球放在一个蓝色盒子里,那么得分是E。如果把一个蓝色小球放在一个红色盒子里,那么得分也是E。现在给出R,B,C,D,E。应该如何放置这些小球进盒子,才能使得总得分最大?输出最大的总得分。
输入
一行,5个整数,分别是R,B,C,D,E。(1 ≤ R ≤ 100,1 ≤ B ≤ 100, -1000 ≤ C,D,E ≤ 1000)
输出
一个整数,最大总得分。
样例输入 Copy
2 3 100 400 200样例输出 Copy
1400提示
看着挺唬人的题,一开始直接跳过了,但实际上比较简单,把红蓝两球看成一对一对的,比较他们红红蓝蓝对应和交错的大小就可以进行选择方法。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int r,b,c,d,e;
scanf("%d %d %d %d %d",&r,&b,&c,&d,&e);
if(c+d>2*e)
{
printf("%d",r*c+b*d);
} else
{
if(r>b){
printf("%d",e*2*b+abs(b-r)*c);
}else{
printf("%d",e*2*r+abs(b-r)*d);
}
}
}
问题 G: 取余
题目描述
给你n个正整数a1,a2,...,an。
求(a1*a2*...*an) % 10007的值。输入
第一行一个整数n,表示整数的个数
第二行,n个用空格隔开的正整数输出
一个整数,(a1*a2*...*an) % 10007
样例输入 Copy
2 10 20样例输出 Copy
200提示
30%的数据,(a1*a2*...*an)<2000000000
100%的数据,n≤1000,0<ai≤110
这次搞死我的题目之一,当时非常痛苦,下机必应后我只想抽死自己,有过两种错误思路:
1.全部乘进一个longlong sum里,显然超范围。
2.把每个数都%10007再扔进sum,白痴一样...,小于10007的数累乘还是会突破极限。
最后是用了sum=sum*a%10007
猛然发现,这样可以随时侦测sum是否超极限,而且还相当于给每个a都进行的取余,相当于给在最后的sum取余。
最后简简单单嘿嘿嘿
#include<stdio.h>
int main()
{
long long n,sum=1,a,p;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a);
sum=sum*a%10007;
}
printf("%lld",sum);
}
问题 H: 加密
题目描述
文件加密最简单的方法是把文件的原文中的每个字母用另一个字母来代替。
假设原文中只包括26个英文字母(有大写和小写),没有其他符号,且长度不超过100,加密规则如下:
输入
一行字符串,代表原文,仅由大小写英文字母构成。
输出
一行字符串,原文加密后的密文。
样例输入 Copy
abD样例输出 Copy
yzB
这道题也非常简单其实,把他放上来纯粹是因为当时在写的时候,忘了排除回车键的影响,一直多输出一个“,幸好最后项链出来,扣了一分,以此铭记它。
#include<stdio.h>
int main()
{
char ch;
while(1)
{
ch=getchar();
if(ch<65)
{
break;
}
if(ch<=66||(90<ch&&ch<=98))
{
printf("%c",ch+24);
}else{
printf("%c",ch-2);
}
}
}
问题 I: 进制转换
题目描述
输入十进制正整数n和k,输出n的k进制整数。
我们熟悉的十进制整数所需的10个基数(基本的数字符号)是0,1,2,3,4,5,6,7,8,9。
当10<k≤16时,k进制的k个基数从小到大分别依次是0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F中的前k个符号。
如n=6,k=2时,6的2进制表示是110。
如n=30,k=16时,30的16进制表示是1E。输入
一行两个整数n和k,中间一个空格隔开。
输出
一行,n的k进制数
样例输入 Copy
1024 2样例输出 Copy
10000000000提示
100%的数据,0<n≤10的18次方,2≤k≤16
考试的时候因为太菜怕没有时间,看见大家正确率低,做的人也不多,就直接跳过了。后来做的时候,虽然答案都对上了,但是就是显示错误,我不理解呜呜呜
/*这里来一段自己写的错误代码
#include<stdio.h>
int main()
{
long long n,k;
char b,c[6]={'A','B','C','D','E','F'};
scanf("%lld %lld",&n,&k);
int i,a[100];
for(i=1;n!=0;i++)
{
a[i]=n%k;
n/=k;
}
int flag=0;
for(int j=i;j>=1;j--)
{
if(a[j]==0&&flag==0){
continue;
}else if(a[j]<9)
{
printf("%d",a[j]);
}else{
switch(a[j])
{
case 10:printf("%c",c[0]);break;
case 11:printf("%c",c[1]);break;
case 12:printf("%c",c[2]);break;
case 13:printf("%c",c[3]);break;
case 14:printf("%c",c[4]);break;
case 15:printf("%c",c[5]);break;
}
}
flag=1;
}
}
*/
到现在依然没有什么头绪,回头问问群里的大佬们。
问题 J: 上学路线
题目描述
小D从家到学校的道路结构是这样的:由n条东西走向和m条南北走向的道路构成了一个n*m的网格,每条道路都是单向通行的(只能从北向南,从西向东走)。
已知小D的家在网格的左上角,学校在网格的右下角。
问小D从他的家到学校一共有多少种不同的上学路线。输入
两个正整数n和m,意义如题目所述。
输出
小D上学路线数量,结果对1000000007取余。
样例输入 Copy
3 4样例输出 Copy
10提示
100%的数据,n,m≤1000
但凡沾点数学就直接给我淦废,简单的高中排列组合题,我就硬是想不上去,气死。
看了大佬们说要用递归做这个题,不太会,挖个坑以后再来填吧。先附上大佬的代码。
#include<iostream>
using namespace std;
int n, m;
long long fd[1000][1000] = {0};//记忆化搜索,用来保存到点x,y的路径数目
long long sove(int x,int y)
{
if (x <= 1 || y <= 1)
return 1;
if (fd[x][y] == 0)//不知道到这个点有多少条
{ /*结果太大,对其取模,题目中要求的*/
fd[x][y] = (sove(x - 1, y) + sove(x, y - 1))% 1000000007;//递归求解,并记忆
return fd[x][y];
}
else//以前递归搜索过,直接返回记忆下的值,不再递归
return fd[x][y];
}
int main(void)
{
cin >> n >> m;
long long ans = sove(n,m);
cout << ans << endl;
return 0;
}
希望高数离散不挂科