新生38

排队,多面骰子,听歌识曲,花坛,最大回文数

排队:

题目描述

洛洛在外出旅游的时候发现社会上文明的现象越来越多,人们在买票的时候都会自发地排队等候。
遗憾的是排队的人身高参差不齐,有时候前后两人之间的身高相差太大,缺乏一些美感。
如果把前后两人的身高差(差值为正数)表示为两者前后相邻时产生的违和度,一段连续的人群因为前后两人身高不同而产生的违和度之和就可以被称为违和值。洛洛希望知道在队伍哪一段,且该段队伍由连续的m个人组成,其违和值最小。
 

输入

第一行输入两个正整数 n,m,n表示队伍的总人数,m表示某一段的人数。
第二行输入n个整数,表示队伍中n个人的身高(单位:厘米)。
 

输出

输出包含一个整数,即最小的违和值。

样例输入 Copy

样例输入1
4 3
1 2 4 7

样例输入2
4 3
10 7 5 4

样例输出 Copy

样例输出1
3

样例输出2
3

提示

样例2说明:m=3,要选取3个连续的人有两种选法:
10 7 5: 违和度之和=3+2=5
7 5 4: 违和度之和=2+1=3
所以答案是3。

对于50%的数据保证2 ≤ n ≤ 10;
对于80%的数据保证2 ≤ n ≤ 1000;
对于100%的数据保证2 ≤ n ≤ 100000,1 ≤ m < n,每个人的身高不超过300厘米。
典型的一个差分和前缀和的题,这次两个一起上了,不难,不过我改代码的时间挺长...
复制代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int a[N],b[N],c[N];
long long s[N];
int main(){
    long long int n,m;
    cin>>n>>m;
    int j=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=abs(a[i]-a[i-1]);
        if(i>=2)
        {
            c[j]=b[i];
            s[j]=s[j-1]+c[j];
            j++;
        }
    }
    int minn=10000000;
    for(int i=1;i<=n-1;i++)
    {
        int l=i,r=i+m-2,x;
        x=s[r]-s[l-1];
        if(x<0)
            break;
        minn=min(minn,x);
    }
    cout<<minn<<endl;
        return 0;
}
复制代码

多面骰子:

题目描述

洛洛现在手上有三颗多面骰子,多面骰子不是常见的六面骰子,而是33面骰子、100面骰子……一般来说,i面骰子每个面上的点数分别是1,2,3,……i。
洛洛手上的三颗骰子的面数可能并不相同,他想知道掷出三颗骰子的所有情况中,三颗骰子的点数之和出现最多次数是几点。
如果存在多个点数之和出现次数相同的情况,则按点数之和从小到大顺序输出。
 

输入

第一行输入三个整数 n1, n2, n3,分别表示三颗骰子各自的面数。

输出

输出一行含任意个整数,分别表示次数最多的点数之和,用空格隔开。

样例输入 Copy

样例输入1
1 2 3

样例输入2
2 3 4

样例输出 Copy

样例输出1
4 5

样例输出2
6

提示

【样例解释】
样例1,骰子投出来有以下六种情况:
1+1+1=3  1+1+2=4  1+1+3=5
1+2+1=4  1+2+2=5  1+2+3=6
可以看出4和5的出现次数最多且都是2次。
 
对于50%的数据,保证1 ≤ n1,n2,n3 ≤ 5;
对于80%的数据,保证1 ≤ n1,n2,n3 ≤ 10。
对于100%的数据,保证1 ≤ n1,n2,n3 ≤ 100。
反正就三个,枚举呗,然后桶排:
复制代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int s[N];
int main(){
    int a,b,c,minn=1000000,maxn=-1,maxnn=-1;
    cin>>a>>b>>c;
    for(int i=1;i<=a;i++)
    {
        for(int j=1;j<=b;j++)
        {
            for(int z=1;z<=c;z++)
            {
                int sum=0;
                sum=i+j+z;
                minn=min(minn,sum);
                maxn=max(maxn,sum);
                s[sum]++;
                maxnn=max(s[sum],maxnn);
            }
        }
    }
    for(int i=minn;i<=maxn;i++)
    {
        if(s[i]==maxnn)
            cout<<i<<" ";
    }
    return 0;
}
复制代码

听歌识曲:

题目描述

洛洛有一份私人歌单,歌单里面塞满了他喜欢的歌曲,像夏恋、雨道、彩月、幻昼……整整有好几百首。洛洛每天都要把他的歌单听一遍,以致于他都能知道在什么时候放的是什么歌。
洛洛在向你推荐了他的歌单之后,决定考考你,从他的歌单开始播放起,第 t 秒正在播放的是第几首歌。
 

输入

第一行输入两个整数 n 和 t,分别表示歌单的歌曲总数以及第 t 秒播放哪首歌。
第二行有 n 个整数,A1, A2,..., An,分别表示歌单的第 i 首歌将会播放多长时间。
 

输出

输出一个整数,表示歌单按顺序播放后,第t秒播放的是第几首歌。

样例输入 Copy

样例输入1		
3 5
5 5 5

样例输入2
3 5
1 4 5

样例输入3
3 5
1 3 5

样例输出 Copy

样例输出1
1

样例输出2
2

样例输出3
3

提示

【样例3解释】
歌单中总共有三首歌:
第一首歌播放1秒,占第1秒;
第二首歌播放3秒,占第2-4秒;
第三首歌播放5秒,占第5-9秒。
所以第5秒播放的是第三首歌曲。
 
对于30%的数据,保证1≤n≤3;
对于60%的数据,保证1≤n≤2000,1≤Ai≤500;
对于100%的数据,保证1≤n≤100000,1≤Ai≤1000,1≤t≤
这题浪费了不少时间着实不应该,想复杂了,没那么烦的
chicken

题目描述

小 x 非常喜欢小鸡翅。他得知 NSC 超市为了吸引顾客,举行了如下的活动:
一旦有顾客在其他超市找到更便宜的小鸡翅,NSC 超市将免费送给顾客 1000g 小鸡翅。小 x 为了尽可能的省钱,走遍了各大超市,统计了小鸡翅的价格。NSC 的工作人员通过不法手段盗取了这些资料。现在 NSC 的工作人员希望你能帮他们定一个尽可能低的价格(1000克 小鸡翅的价格),使小 x 吃不到免费的小鸡翅。

输入

第一行两个正整数 XNSC (1 ≤ XNSC ≤ 100) 和 YNSC (1 ≤ YNSC ≤1000),表示现在在 NSC 超市,YNSC 克 小鸡翅要卖 XNSC 元。
第二行一个正整数 N,表示其他超市的个数。
接下来 N 行,每行两个正整数 Xi(1 ≤ Xi ≤ 100) 和 Yi(1 ≤ Yi ≤ 1000),表示在第 i 家超市,Y  克小鸡翅卖 Xi 元。

输出

有且仅有一行,包含一个实数 A,表示 NSC 超市可以定的最高价格:A 元/千克。A 保留两位小数。

样例输入 Copy

5 100
3
4 100
3 100
7 100

样例输出 Copy

30.00
这题就是转化单位
复制代码
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
    int a,b,n;
    cin>>a>>b;
    cin>>n;
    double x,y,m,c,minn=1000000;
    for(int i=0;i<n;i++)
    {
        cin>>x>>y;
        if(y<=1000)
        {
            m=1000/y;
            x*=m;
            minn=min(minn,x);
        }
        else
        {
            c=y/1000;
            x/=c;
            minn=min(minn,x);
        }
    }
    cout<<fixed<<setprecision(2)<<minn<<endl;
    return 0;
}
复制代码

花坛:

题目描述

洛洛在散步的时候,看到公园的正方形花坛里开放着许多他不认识的花卉。仔细观察之后,他又发现这些花的种植位置是有规律的。
洛洛发现在正方形花坛的最外层,即第一层上的花都是同一颜色;而花坛的第二层,花的颜色又都是一样的……正方形花坛由若干层花构成,同一层上的花都是同一颜色的,不同层之间的花颜色不一定相同。如下图所示,是一个具有三层花的正方形花坛:

在回到家后,洛洛还记得花坛有几层花围成,以及每层花的颜色,花的颜色用英文大小写字母来表示。但是洛洛忘记了整个花坛的图像,洛洛希望你根据他的描述,把整个花坛的图像用计算机打印字符的方式表示出来。
 

输入

第一行输入一个整数 n,表示正方形花坛有n层花。
第二行输入n个字符,第i个字符表示第i层花的颜色。第一层是花坛最外层。第n层是花坛最内层,只有一朵花。
 

输出

输出2*n-1行,由(2*n-1)*(2*n-1)个字符组成的花坛的图像。

样例输入 Copy

样例输入1
3
abC

样例输入2
4
abac

样例输出 Copy

样例输出1
aaaaa
abbba
abCba
abbba
aaaaa

样例输出2
aaaaaaa
abbbbba
abaaaba
abacaba
abaaaba
abbbbba
aaaaaaa

提示

样例解释】
样例1,即如上图,只有三层花:
第一层是颜色为字符a的花,在最外层;
第二层是颜色为字符b的花,在第二层。
第三层是颜色为字符c的花,只有一朵,在最内层。
 
对于20%的数据,保证只有一种花,颜色为字符a;
对于50%的数据,保证1 ≤ n ≤ 10,颜色只用小写字母表示,
对于80%的数据,保证1 ≤ n ≤ 100。
对于100%的数据,保证1 ≤ n ≤ 1000,颜色用小写字母、大写字母表示。
注意:对于不同层的花朵来说,可能存在颜色相同的情况。
这个就是字符版的回型方阵:
复制代码
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<iostream>
using namespace std;
char s[2000][2000],ch[2000];
int main(){
    int n;
    scanf("%d",&n);
    scanf("%s",ch);
    int a=2*n-1;
    for(int k=1;k<=(a+1)/2;k++)
    {
        for(int i=k;i<=a+1-k;i++)
        {
            for(int j=k;j<=a+1-k;j++)
            {
                s[i][j]=ch[k-1]; 
            }
        }
    }
    for(int i=1;i<=a;i++)
    {
        for(int j=1;j<=a;j++)
        {
            printf("%c",s[i][j]);
        }
        printf("\n");
    }
    return 0;
}
复制代码

 最大回文数:

题目描述
回文数指的是一个数字,从左到右读和从右到左读都一样。例如,1221和1234321是回文数,1234不是回文数。现有n个正整数ai(i=0,1,2,3,…n-1),请找出其中最大的回文数。
输入
第一行只有一个正整数n,代表正整数ai的个数。
接下来的n行,每行包含一个正整数ai。输入保证一定有回文数。
输出
一行,一个正整数,即最大的回文数。
样例输入 Copy
【样例1】
3
4718
1221
121
【样例2】
5
3944
953
8
75739
46
样例输出 Copy
【样例1】
1221
【样例2】
8
提示
对于30%的数据,1≤n≤100,1≤ai≤108。
对于60%的数据,1≤n≤1000,1≤ai≤1016。
对于100%的数据,1≤n≤104,1≤ai≤1032。
这题哈哈哈我傻乎乎的就这么写了,没有考虑数据范围,后来发现是高精度,用字符串存然后排序就好了

复制代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string ch[1010];
int cmp(string a,string b)
{
    if(a.size()==b.size())
        return a>b;
    else
        return a.size()>b.size();
}
int main(){
    int n;
    cin>>n;
    int i=0;
    while(n--)
    {
        string a,b;
        cin>>a;
        b=a;
        reverse(b.begin(),b.end());
        if(a==b)
        {
            ch[i]=a;
            i++;
        }
    }
    sort(ch,ch+i,cmp);
    cout<<ch[0]<<endl;
    return 0;
}
复制代码

 

posted @   小志61314  阅读(182)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示