【模拟练习】[一]

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。

来源

NOIP2015普及组


#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;
}
View Code

//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;
}
View Code

 以上是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;
}
View Code
#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;
}
View Code

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 的得分。

输入输出样例

输入样例#1:
10 5 6
0 1 2 3 4
0 3 4 2 1 0
输出样例#1:
6 2
输入样例#2:
9 5 5
0 1 2 3 4
1 0 3 2 4
输出样例#2:
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(0T1000≤T≤100),为数据组数

每组数据只有一行,为nn(0<n1000<n≤100)和ss(0s9000≤s≤900).

Output

输出谕神的密码

Sample input and output

Sample InputSample Output
1
2 15
69 96

Hint

就一组测试数据 22位数各位和为1515的最大值是9696, 最小值是6969.

Source

第七届ACM趣味程序设计竞赛第二场(正式赛)

 
 
 

 P2708 硬币翻转

题目背景

难度系数:☆☆☆☆☆(如果你看懂了)

题目描述

从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的。正面朝上的用1表示,背面朝上的用0表示。现在要求从这行的第一个硬币开始,将n个硬币(1<=n<=硬币个数)一起翻面,问如果要将所有硬币翻到正面朝上,最少要进行这样的操作多少次?

输入输出格式

输入格式:

一个字符串(当然不限长度,在字符串范围之内),有0和1组成

输出格式:

要翻转的最少次数

输入输出样例

输入样例#1:
10
输出样例#1:
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;
}
View Code
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/gc812/p/7087411.html