srm 592 div 2

这篇博客详细介绍了三道TC竞赛题目,包括寻找第二小的m个数之和、求排列满足条件的种数以及非递减序列的删除方案。解题策略涉及贪心算法、全排列枚举以及最长递增子序列(LIS)结合状态压缩。通过具体的代码实现,帮助读者理解解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很少做TC,第一次写报告。

第一题:

题目意思:

有n个不同的数,求第二小的m个的和。

解题思路:

贪心,从小到大排序。去掉第m个加上第m+1个即可。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
class LittleElephantAndBooks
{
	public:
	int getNumber(vector<int>pages,int number)
	{
   	 	int si=pages.size();
    
    	sort(pages.begin(),pages.end());
   		 int sum=0;
   		 for(int i=0;i<number-1;i++)
      	  sum+=pages[i];
    	sum+=pages[number];
   	 return sum;
	}
};

第二题:

求两个1~n的排列A和B的种数,使得Σmax(Ai,Bi)>=k的。

解题思路:

直接暴力就可以。

先把A排成1~n,固定,然后枚举B的所有排列,对应关系确定后,全排列,也即乘以n!就行了。10!也就10^6

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

vector<int>myv1;
vector<int>myv2;

long long getNumber(int N,int K)
{
    myv1.clear(),myv2.clear();
    for(int i=1;i<=N;i++)
    {
        myv1.push_back(i);
        myv2.push_back(i);
    }
    ll ans=0;
    do
    {
        int sum=0;
        for(int i=0;i<myv1.size();i++)
            sum+=max(myv1[i],myv2[i]);
        if(sum>=K)
            ans++;
    }while(next_permutation(myv2.begin(),myv2.end()));
    ll ff=1;
    for(int i=2;i<=N;i++)
        ff*=i;
    return ans*ff;

}

第三题:

给一个A(A<=10^15),N(N<=100).这样就形成了一个数列A,A+1,....,A+N,现在可以对这N+1个数,删除某些数的某些位但不能把一个数所有的位都删掉,可以有前置零,要求删除后该序列满足非递减,求删除的种数,只要删除的有一位不同则记为不同的删除种数。什么都没删也记为一种。

解题思路:

LIS+状态压缩取数处理。

对于某一个数,一共只有15位,所有可以用15位的二进制保存每位是否还保存在。这样把数取出来后,LIS处理就行了。

熟悉各种STL。


代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define Mod 1000000007
using namespace std;

struct Elem
{
    LL va,sum;
};

bool operator < (const Elem & a,const Elem & b)
{
    return a.va<b.va;
}
//满足非递减性质
long long getNumber(long long A,int N)
{
    vector<Elem>dp;
    Elem ee={0,1}; //初始化
    dp.push_back(ee);

    for(int i=0;i<=N;i++)
    {
        vector<Elem>tt; //将该位所有的状态放到一个vector里面
        stringstream ss;
        ss<<(A+i); //把A+i读进去
        string str=ss.str(); //转化成字符串,对每一位好处理
        for(int i=1;i<(1<<str.size());i++) //每一个二进制的i,对应一个取出来的数
        {
            LL tmp=0;  //每一个数代表着一种状态
            for(int j=0;j<str.size();j++)
            {
                if(i&(1<<j))//是1的话就把该位取出来
                {
                    tmp*=10;
                    tmp+=str[j]-'0';
                }
            }
            Elem cur={tmp,0}; //注意不存在的情况为0
            vector<Elem>::iterator it=upper_bound(dp.begin(),dp.end(),cur);//注意是查找结构体
            //在前面先找到大于tmp的,然后-1,表示小于等于tmp的
            if(it!=dp.begin())
                cur.sum=it[-1].sum; //注意迭代器的用法,-1表示前一个迭代器
            tt.push_back(cur);
        }
        sort(tt.begin(),tt.end()); //对它按va排序
        for(int i=1;i<tt.size();i++) //tt[i].sum表示当前这位,值小于等于tt[i].va,的总个数
            tt[i].sum=(tt[i].sum+tt[i-1].sum)%Mod;
        dp.swap(tt);//交换两个vector

    }
    return dp.back().sum;
}



### 关于 SACMA SRM01 的中文版资料 SACMA SRM01 是由复合材料学会(Society for the Advancement of Material and Process Engineering, SAMPE)发布的标准之一,主要用于描述短切玻璃纤维增强热固性模塑料的性能测试方法[^1]。该标准通常涉及材料特性、制备工艺以及质量控制等方面的内容。 对于寻找 SACMA SRM01 中文版文档的需求,可以通过以下途径获取: #### 1. 官方渠道 SAMPE 或其中国分会可能提供官方翻译版本的下载服务。建议访问 SAMPE China 的官方网站或其他授权机构网站查询是否有正式的中文译本[^2]。 #### 2. 图书馆资源 部分高校图书馆或行业技术中心会收藏此类国际标准的技术文件及其翻译件。可以联系所在地区的科技图书馆或者通过 Interlibrary Loan (ILL) 请求借阅相关文献[^3]。 #### 3. 商业平台购买 一些商业数据库如 CNKI(知网)、万方数据等可能会收录经过合法授权的标准翻译版本。如果这些平台上未找到具体条目,则需进一步确认是否已发布官方认可的中文版本[^4]。 以下是基于 Python 编写的简单脚本来演示如何自动化搜索某些在线学术资源库中的关键词匹配项: ```python import requests from bs4 import BeautifulSoup def search_sacma(keyword="SACMA SRM01"): url = f"https://example-academic-resource.com/search?q={keyword}" response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') results = [] for item in soup.find_all('div', class_='result-item'): title = item.find('h3').text.strip() link = item.find('a')['href'] abstract = item.find('p', class_='abstract').text.strip()[:150]+'...' results.append({ "title": title, "link": link, "abstract": abstract }) return results if __name__ == "__main__": res = search_sacma("SACMA SRM01") for r in res: print(f"{r['title']}\n{r['link']}\nAbstract: {r['abstract']}\n---\n") ``` 请注意以上代码仅为示例用途,在实际应用前应调整目标网址并遵循各站点的服务条款与版权政策[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值