【模拟练习】[一]
1684: 金币
时间限制: 1 Sec 内存限制: 128 MB
提交: 143 解决: 97
[提交][状态][讨论版]
题目描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天) ,每天收到两枚金币;之后三天(第四、五、六天) ,每天收到三枚金币;之后四天(第七、八、九、十天) ,每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 N 天每天收到 N 枚金币后,骑士会在之后的连续 N+1 天里,每天收到 N+1 枚金币。
请计算在前 K 天里,骑士一共获得了多少金币。
输入
输入文件名为 coin.in。
输入文件只有 1 行,包含一个正整数
K,表示发放金币的天数。
输出
输出文件名为 coin.out。
输出文件只有 1
行,包含一个正整数,即骑士收到的金币数。
样例输入
6
样例输出
14
提示
【输入输出样例 1 说明】
骑士第一天收到一枚金币; 第二天和第三天, 每天收到两枚金币; 第四、 五、
六天,
每天收到三枚金币。因此一共收到 1+2+2+3+3+3=14 枚金币。
【输入输出样例
2】
coin.in
1000
coin.out
29820
见选手目录下的
coin/coin2.in 和 coin/coin2.ans。
【数据说明】
对于 100%的数据,1 ≤ K ≤
10,000。
来源
#include<algorithm> #include<cstdio> #include<cstring> #include<iostream> #include<cmath> using namespace std; int n; int ans; int main() { cin>>n; int tian=1; while(n>0) { n-=tian; if(n<0)ans+=tian*(tian+n); else ans+=tian*tian; tian++; } cout<<ans; puts(""); return 0; }
//ATT:只有等于0才是假 其他都是真的
描述
对一个给定的自然数M,求出所有的连续的自然数段(连续个数大于1),这些连续的自然数段中的全部数之和为M。
例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解。
格式
输入格式
包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000)
输出格式
每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定的输入数据,保证至少有一个解。
样例1
样例输入1
10000
样例输出1
18 142
297 328
388 412
1998 2002
限制
1s
有一点想法的暴力
利用一下等差数列求和公式owo
#include<algorithm> #include<cstdio> #include<cstring> #include<iostream> #include<cmath> using namespace std; int m; int main() { cin>>m; for(int i=1;i<=m/2;++i) { for(int j=m;j>2/m;--j) { if((j-i+1)*(j+i)/2==m) { cout<<i<<" "<<j; puts(""); } } } return 0; }
以上是m^2的T版做法owo
判断delta是不是完全平方数 把一个数开根号 取根的整数部分 乘起来 如果还等于原来那个数的话那就是完全平方数 就直接把sqrt出来的值赋给一个int变量就OK了
#include<algorithm> #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #define maxn 100005 using namespace std; int m; int main() { cin>>m; for(int i=1;i<=m;i++) for(int j=i+1;j<=m/i+i;j++) if((i+j)*(j-i+1)==2*m) { printf("%d %d",i,j); puts(""); } return 0; }
#include<algorithm> #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #define maxn 100005 using namespace std; int m; long int t,n,i; int main() { cin>>m; int t=0; for(i=1;i<m;++i) { if(n<=m)n+=i; while(n>m) { n-=t; t++; if(n==m) { cout<<t<<" "<<i; puts(""); } } } return 0; }
P1328 生活大爆炸版石头剪刀布
题目描述
石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第8 集中出现了一种石头剪刀布的升级版游戏。
升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势:
斯波克:《星际迷航》主角之一。
蜥蜴人:《星际迷航》中的反面角色。
这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。
现在,小A 和小B 尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有周期性规律的,但周期长度不一定相等。例如:如果小 A以“石头 - 布- 石头- 剪刀- 蜥蜴人- 斯波克”长度为6 的周期出拳,那么他的出拳序列就是“石头- 布- 石头- 剪刀- 蜥蜴人- 斯波克- 石头- 布- 石头- 剪刀- 蜥蜴人- 斯波克- ……”,而如果小B 以“剪刀- 石头- 布- 斯波克- 蜥蜴人”长度为5 的周期出拳,那么他出拳的序列就是“剪刀- 石头- 布- 斯波克- 蜥蜴人- 剪刀- 石头- 布-斯波克- 蜥蜴人- ……”
已知小A 和小B 一共进行N 次猜拳。每一次赢的人得1 分,输的得0 分;平局两人都得0 分。现请你统计N 次猜拳结束之后两人的得分。
输入输出格式
输入格式:
输入文件名为rps.in。
第一行包含三个整数:N ,NA,NB,分别表示共进行 N 次猜拳、小 A 出拳的周期长度,小B 出拳的周期长度。数与数之间以一个空格分隔。
第二行包含NA个整数,表示小 A 出拳的规律,第三行包含NB个整数,表示小 B 出拳的规律。其中,0 表示“剪刀”,1 表示“石头”,2 表示“布”,3 表示“蜥蜴人”, 4 表示“斯波克”。数与数之间以一个空格分隔。
输出格式:
输出文件名为rps.out 。
输出一行, 包含两个整数,以一个空格分隔,分别表示小A 、小B 的得分。
输入输出样例
10 5 6 0 1 2 3 4 0 3 4 2 1 0
6 2
9 5 5 0 1 2 3 4 1 0 3 2 4
4 4
说明
对于100%的数据,0 < N ≤ 200 ,0 < NA ≤ 200 , 0 < NB ≤ 200 。
谕神的密码
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
谕神是集训队里面智商数一数二的大神,在他的电脑里储存着他在学习的东西。每天都要通过学习来提高自己的知识水平。然而,作为一个长者,谕神不愿意将自己的学习资料给那些too young, too simple, sometimes naive的人看,以免被他们看了去搞一个大新闻。于是,谕神给自己的电脑设置了密码。
当然,他设置的密码也要按照基本法。这个基本法是谕神自己搞出来的。法则是这样的:
1、密码由22个nn位数组成,中间由空格隔开,其中,两个数的各个位的和均为ss
2、是满足1条件的最小的数和最大的数
3、当找不到nn位数的和为s的时候,密码就是:-1 -1
。
4、谕神保证密码的22个数中没有前导00。
他这个密码只是为了防止too young, too simple, sometimes naive的人进入电脑的,对于你们这些高智商的人群,破译密码应该并不难吧~~
注意,单独的00,是合法的哦~
Input
先读入一个TT(0≤T≤1000≤T≤100),为数据组数
每组数据只有一行,为nn(0<n≤1000<n≤100)和ss(0≤s≤9000≤s≤900).
Output
输出谕神的密码
Sample input and output
Sample Input | Sample Output |
---|---|
1 2 15 |
69 96 |
Hint
就一组测试数据 22位数各位和为1515的最大值是9696, 最小值是6969.
Source
题目背景
难度系数:☆☆☆☆☆(如果你看懂了)
题目描述
从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用1表示,背面朝上的用0表示。现在要求从这行的第一个硬币开始,将n个硬币(1<=n<=硬币个数)一起翻面,问如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?
输入输出格式
输入格式:
一个字符串(当然不限长度,在字符串范围之内),有0和1组成
输出格式:
要翻转的最少次数
输入输出样例
10
2
说明
样例1说明:
第1次翻转:把第一个硬币翻到反面,字符串为00
第2次翻转:把第一、二个硬币一起翻到正面,字符串为11,翻转完成,输出2
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define maxn 10000 using namespace std; int main() { string s; int ans=0; cin>>s; int n=s.length(); for(int i=1;i<n;++i) { if(s[i]!=s[i-1])++ans; } if(s[n-1]=='0')++ans; cout<<ans; puts(""); return 0; }