12-6 从0开始当弱鸡 对于一些排序和stl容器的联系

关于排列的几个相关:函数和stl容器

1.sort(首地址,末地址,排序遵照方式cmp);

cmp为自定义,通常结构体,vector打包带走;

2.next_permutation 是从第二个有顺序的全排序开始,若果要打出所有的,与do while语句联合使用;

3.set自动排序去重(也有只排序不去重和只去重不排序)

4.map自动排序去重(主要体现一种映射的关系,能够将两个数据关联起来如,像数组的下标和数组储存的数一样的关系);

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

把 11 ~ 99 这 99 个数字分成两组,中间插入乘号, 有的时候,它们的乘积也只包含 11 ~ 99 这 99 个数字,而且每个数字只出现 11 次。

比如:

984672 * 351 = 345619872
98751 * 3462 = 341875962
9 * 87146325 = 784316925
...

符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?

注意,需要输出的是一个整数,表示那个最大的积,只输出乘积,不要输出整个算式。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

#include <bits/stdc++.h>
using namespace std;
bool check1(long long num){
	set<int>se;
	while(num){
		se.insert(num%10);
		if(num%10==0) return false;
		num/=10;
	}
	return se.size()==9;//很巧妙啊,利用去重后的个数;
}
int main(){
	long long ans=0;
	int num1[9]={1,2,3,4,5,6,7,8,9};
	do{for(int i=1;i<9;i++){
		long long num_2=0;
		long long num_1=0;
		for(int j=0;j<i;j++){num_1+=num1[j]*pow(10,i-j-1);}
		for(int j=i;j<9;j++){num_2+=num1[j]*pow(10,9-j-1);
		}
		if(check1(num_2*num_1)&&num_1*num_2>ans){
			ans=num_1*num_2;
			cout<<ans<<endl;
		}
	}
	}
	while(next_permutation(num1,num1+9));
	return 0;
}//选择题,直接打表嘻嘻

题目描述

小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有 NN 行。其中每一行的格式是:

ts\ idts id

表示在 tsts 时刻编号 idid 的帖子收到一个"赞"。

现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为 DD 的时间段内收到不少于 KK 个赞,小明就认为这个帖子曾是"热帖"。

具体来说,如果存在某个时刻 T 满足该帖在 [T,T+D)[T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 KK 个赞,该帖就曾是"热帖"。

给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。

输入描述

输入格式:

第一行包含三个整数 N,D,KN,D,K。

以下 N 行每行一条日志,包含两个整数 ts 和 id。

其中,1 \leq K \leq N \leq 10^5, 0 \leq ts \leq 10^5,0 \leq id \leq 10^51≤K≤N≤105,0≤ts≤105,0≤id≤105。

输出描述

按从小到大的顺序输出热帖 idid。每个 idid 一行。

输入输出样例

示例

输入

7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3

输出

1
3

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

这个涉及到尺取法啦!

两个操作:

1.以ts为测量长度来找左闭右开的两个端点;

2输出去重后的id名;

​​​​​​​​​​#include<bits/stdc++.h>
using namespace std;
const int maxn = 0x3f3f3f;
int n,d,k;
vector<int> t[maxn];
int ans[maxn];
 
bool judge(int x)
{
    int len = t[x].size();
    if(len<k)
        return 0;
    sort(t[x].begin(),t[x].end());
    int l = 0, r = 0, sum = 0;
    while(l<=r&&r<len)
    {
        sum++;
        if(sum>=k)
        {
            if(t[x][r]-t[x][l]<d)
            {
                return 1;
            }
            else
                sum--,l++;
        }
        r++;
    }
    return 0;
}
int main(){
    cin>>n>>d>>k;//任意区间d不少于k
    for(int i=1;i<=n;i++)
    {
        int ts,id;
        cin>>ts>>id;
        t[id].push_back(ts);
    }
    int cnt = 0;
    for(int i=1;i<maxn;i++)
    {
        if(judge(i))
            ans[++cnt] = i;
    }
    for(int i=1;i<=cnt;i++)
        cout<<ans[i]<<endl;
 
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值