日常题目分享5

《数学大师》

题目背景

宝子最近在跟着数学大师但总学数学,今天他学了等差数列,但总决定给他留一道练习题。

题目描述

但大佬首先建了 n 个特斯拉电磁塔,这些电塔排成一排,从左到右依次标号为 1 到 n,第 i个电塔的高度为 h[i] 。

建筑大师需要从中选出一些电塔,然后这些电塔就会缩到地下去。这时候,如果留在地上的电塔的高度,从左向右构成了一个等差数列,那么这个选择方案就会被认为是美观的。

建筑大师需要求出,一共有多少种美观的选择方案,答案模 998244353。

注意,如果地上只留了一个或者两个电塔,那么这种方案也是美观的。地上没有电塔的方案被认为是不美观的。

同时也要注意,等差数列的公差也可以为负数。

输入格式

第一行一个正整数 n。

第二行 n个非负整数,第 i个整数是第 i个电塔的高度 h[i] 。

输出格式

输出一个整数,表示美观的方案数模 998244353的值。

输入输出样例

输入

8
13 14 6 20 27 34 34 41 

输出

50

输入

100
90 1004 171 99 1835 108 81 117 141 126 135 144 81 153 193 81 962 162 1493 171 1780 864 297 180 532 1781 189 1059 198 333 1593 824 207 1877 216 270 225 1131 336 1875 362 234 81 288 1550 243 463 1755 252 406 261 270 279 288 1393 261 1263 297 135 333 872 234 881 180 198 81 225 306 180 90 315 81 81 198 252 81 297 1336 1140 1238 81 198 297 661 81 1372 469 1132 81 126 324 333 342 81 351 481 279 1770 1225 549 

输出

11153

说明/提示

设 v为最高的电塔高度。

对于前30% 的数据,0n≤20 。

对于前 60% 的数据,0n≤100,v≤2×10^3 。

对于另外 0% 的数据,所有电塔的高度构成一个等差数列。

对于 %100% 的数据,n≤103,v≤2×10^4 。

紧接昨天


#include<cstdio>
#define ll long long
const int maxn = 1005;
const int MOD = 998244353;
ll h[maxn], n;
ll dp[maxn][maxn];
 
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &h[i]);
    for(int i = 1; i <= n; i++)
    {
        dp[0][i] = 1;
    }
    ll ans = 0;
    for(int i = 2; i <= n; i++)
    {
        for(int j = 1; j < i; j++)
        {
            dp[j][i] = dp[0][j] % MOD;
            for(int k = 1; k < j; k++)
            {
                if(h[j] - h[k] == h[i] - h[j]) dp[j][i] = (dp[j][i] + dp[k][j]) % MOD;
            }
        }
    }
    
    for(int i = 0; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            ans = (ans + dp[i][j]) % MOD;
        }
    }
    printf("%lld\n", ans);
    return 0;
}

宝子到底有多二

宝子的“犯二的程度”被我人为定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11×1.5×2×100%,约为81.82%。本题就请你计算一个给定整数来算算我滴包到底有多二。

输入格式:

输入第一行给出一个不超过50位的整数N

输出格式:

在一行中输出N犯二的程度,保留小数点后两位。

输入样例:

-13142223336

输出样例:

81.82%

easy!注意这pta用不了gets可恶!

#include <iostream>
using namespace std;
int main(){
    string str;
    getline(cin,str);
    int flag=1;
    int num=0;
    double per;
    double result=1.0;
    int len=str.size();
    if(str[0]=='-')
        flag=1;
    else
        flag=0;
    for(int i=0;i<str.size();i++){
            if(str[i]=='2')
                num++;
        }
    if(flag==1){//如果这个数是负数,则程度增加0.5倍;
        per=num*1.0/(str.size()-1)*1.5;
    }
    if(flag==0){
        per=num*1.0/str.size()*1.0;
    }
    if((str[len-1]-'0')%2==0){//如果还是个偶数,则再增加1倍
        per*=2.0;
    }
    else{
        per*=1.0;
    }
    printf("%.2f%%\n",per*100);
    return 0;
}

爱敲钟的猪猪侠

川师上有个自称“爱敲钟的猪猪侠”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于猪猪侠自己作息也不规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。

所以身为程序猿的懒人猪猪侠希望但总写个程序,根据当前时间替猪猪侠敲钟。

输入格式:

输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。

输出格式:

根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:

Only hh:mm.  Too early to Dang.

其中hh:mm是输入的时间。

输入样例1:

19:05

输出样例1:

DangDangDangDangDangDangDangDang

输入样例2:

07:05

输出样例2:

Only 07:05.  Too early to Dang.

easy!

#include <iostream>

using namespace std;
int main(){
    int hh,mm;
    scanf("%d:%d",&hh,&mm);
    if(hh<12 ||(hh==12 && mm==0)){//12点之前
        if(hh<10 && mm <10) printf("Only 0%d:0%d.  Too early to Dang.",hh,mm);
        else if(hh<10 && mm>=10) printf("Only 0%d:%d.  Too early to Dang.",hh,mm);
        else if(hh>=10 && mm<10)printf("Only %d:0%d.  Too early to Dang.",hh,mm);
        else printf("Only %d:%d.  Too early to Dang.",hh,mm);
    }
    else{//判断整点
        if(mm==00)  for(int i=0;i<hh-12;i++) cout<<"Dang";
        else for(int i=0;i<hh-11;i++)cout<<"Dang";
    }
    puts("");
	return 0;
}

《我不是酒神》

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上阿晨和昆昆独特的划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。阿晨和昆昆谁也不服谁所以今天晚上约战要分出谁是酒神!下面给出昆昆和阿晨两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

输入格式:

输入第一行先后给出阿晨和昆昆两人的酒量(不超过100的非负整数),以空格分隔。在这里我们用甲表示阿晨乙表示昆昆,下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中是喊出的数字,是划出的数字,均为不超过100的正整数(两只手一起划)。

输出格式:

在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。

输入样例:

1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16

输出样例:

A
1

注意看题,时刻关注酒量的变化!

#include<iostream>

using namespace std;
int A,B;//甲乙酒量
int N;//轮数
int a1=0,a2=0,b1=0,b2=0;//甲喊 甲划 乙喊 乙划 
int main()
{
    cin>>A>>B;
    int a=A,b=B;//记录酒量变化
    cin>>N;
    while(N--)//谁比划出的数字正好等于两人喊出的数字之和,谁就输了
    {
        cin >> a1 >> a2 >> b1 >> b2 ; 
        if((a2==a1+b1)&&(a2!=b2))//A输
            a--;
        if((b2==a1+b1)&&(a2!=b2))//B输
            b--;
        //输出没倒的那个人喝了多少杯
        //只需要用总酒量减去剩下的就行
        if(a<0)
        {//A倒下  
            cout<<"A"<<endl<<B-b;
            break;
        }
        if(b<0)
        {//B倒下 
            cout<<"B"<<endl<<A-a;
            break;
        }
    }
    puts("");
    return 0;
}

《人帅且66》

当芸芸众生忙着在朋友圈中发照片的时候,总有一些人(比如:但总)因为太帅而寂寞。本题就要求你找出那些帅到没有朋友的人。

输入格式:

输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。

注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。

输出格式:

按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome

注意:同一个人可以被查询多次,但只输出一次。

输入样例1:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888

输出样例1:

10000 88888 23333

输入样例2:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111

输出样例2:

No one is handsome

又是不认真读题,id从00000到99999当他小于10000时不会输出前面的,所以要补0,靠,惨痛的经历一定要补0!!!

#include <iostream>

using namespace std;

int a[100010]={0};
int n,m,l;
int main()
{
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        if(x == 1)cin>>l;
        else
            for(int i = 0;i<x;i ++)
            {
                cin>>l;
                a[l]++;
            }
    }
    cin>>m;
    int sum = 0;
    for(int i = 1;i <= m;i ++)
    {
        cin>>l;
//         b=sum;
        if(a[l]==0)
        {
            if(sum!=0)cout<<" ";
            sum++;
            printf("%05d", l);
            a[l] = 1;
        }
        
    }
    if(sum==0) cout<<"No one is handsome";
    puts("");
    return 0;
}

正整数A+B

题的目标很简单,就是求两个正整数AB的和,其中AB都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式:

输入在一行给出AB,其间以空格分开。问题是AB不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是AB的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:

如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?

输入样例1:

123 456

输出样例1:

123 + 456 = 579

输入样例2:

22. 18

输出样例2:

? + 18 = ?

输入样例3:

-100 blabla bla...33

输出样例3:

? + ? = ?

重点注意一下输入的问题,这个问题也困扰了我好久也想了好久!!!

#include<bits/stdc++.h>
using namespace std;

string a,b;
int check(string str){
    int sum=0;
    for(int i=0;i<str.length();i++){
        if(isdigit(str[i]))
            sum=sum*10+str[i]-'0';
        else return -1;
    }
    if(sum>=1&&sum<=1000) return sum;//[1,1000]
    else return -1;
}
int main(){
    //不要想的太复杂
    cin>>a;
    getchar();
    getline(cin,b);
    int A=check(a);
    int B=check(b);
    if(A==-1) printf("? + ");
    else printf("%d + ",A);
    if(B==-1) printf("? = ");
    else printf("%d = ",B);
    if(A==-1 || B==-1) printf("?\n");
    else printf("%d\n",A+B);
    return 0;
}

但总不胖

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。

输入格式:

输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。

输出格式:

为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!

输入样例:

3
169 136
150 81
178 155

输出样例:

You are wan mei!
You are tai shou le!
You are tai pang le!

这道题简单但重要的是数据处理!

#include <iostream>

using namespace std;
int main()
{
    int h,n;
    double w;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %lf",&h,&w);
        //注意这里给的体重是斤
        w=w/2.0;
        double bz = (h-100)*0.9;
        //一直用的abs,现在才知道居然还有fabs
        if(fabs(bz-w) < bz*0.1) printf("You are wan mei!\n");
        if(fabs(w-bz) >= bz*0.1 && bz<w) printf("You are tai pang le!\n");
        if(fabs(w-bz) >= bz*0.1 && bz>w) printf("You are tai shou le!\n");
    }
    return 0;
 }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值