ACM团队周赛题解(3)
940和822两套div.2
老规矩
#define MAXN 1000000+5
#define MOD 1000000007
#define PI (acos(-1.0))
#define EPS 1e-6
#define MMT(s,a) memset(s, a, sizeof s)
#define GO(i,a,b) for(int i = (a); i < (b); ++i)
#define GOE(i,a,b) for(int i = (a); i <= (b); ++i)
#define OG(i,a,b) for(int i = (a); i > (b); --i)
#define OGE(i,a,b) for(int i = (a); i >= (b); --i)
A - Points on the line(940A)
题意:问最少删除几个数字,使得剩余数字的 最大值 - 最小值 < = m;
思路:思维逆向,求符合题意的最多数字
#include <bits/stdc++.h>
using namespace std;
int a[]={};
int main(){
int n,d,cnt=-;
cin>>n>>d;
for(int i=;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(a[j]-a[i]<=d) cnt=max(cnt,j-i+);
}
}
cout<<n-cnt<<endl;
return ;
}
B - Our Tanya is Crying Out Loud
题意:从n走到1,两种走法,从n走到n-1,花费a;从n走到n/k,花费b,问最小花费
思路:最开始还想成BFS了,不需要BFS,因为每次都是从n往1走,只需要对比一下下一步两种花费哪种最小就行了。特判一下k==1的情况。
int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
cin>>n>>k>>a>>b;
if(k == ){
cout << (n-)*a << endl;
}
else{
ll ans = ;
while(n > ){
if(n%k){
int m = n%k;
n -= m;
if(n<)
ans += a*(m-);
else
ans += a*m;
}
else{
int m = n/k;
if((n-m)*a < b)
ans += (n-m)*a;
else
ans += b;
n = m;
}
}
cout << ans << endl;
}
return ;
}
C - Phone Numbers
题意:给你一个长度为n的字符串,然后让你构造一个长度为m的字符串,只能用n中的字符,可重复,输出m的全排列中字典序比n大的第一个。方便理解,我解释一下第一个样例,n = abc,用这个字符串中的元素构成的长度为3的字符串有很多,比如
aaa, aab, aac, aba, abb, abc, aca, acb.......,然后会发现比abc大的第一个就是aca,所以输出aca。
思路:先分两种情况
当n < m时,这时候只需要在n字符串的后面加m-n个最小字符就行了,因为这就是字典序比n字符串大的第一个字符串。
当n >= m时,首先Hash一下n字符串,这时候我们只需要在n字符串中选取m长度的字符串,然后对这个字符串进行+1操作,也就是把字符串看成k进制数,通过前面的Hash表,进行+1,这样就保证了得到的字符串为m长度,而且是大于n字符串的第一个字符串。
map<char,int> Hsh;
map<int,char> Exhsh;
int k;
char ch1,ch2; void gethash(string s){
string ss(s);
s.erase(unique(s.begin(),s.end()),s.end());
sort(s.begin(),s.end());
ch1 = s[];
ch2 = s[s.size()-];
int len = s.size();
GO(i,,len){
Hsh[s[i]] = i;
Exhsh[i] = s[i];
}
//cout << num << endl;
} int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
int n,m;
string s;
cin>>n>>m>>s;
if(m > n){
cout << s;
sort(s.begin(),s.end());
ch1 = s[];
GO(i,n,m){
cout << ch1;
}
cout << endl;
}
else{
gethash(s);
string ss = s.substr(,m);
int flag = ;
OGE(i,m-,){
if(i == m-){
if(ss[i] < ch2){
ss[i] = Exhsh[Hsh[ss[i]]+];
flag = ;
}
else{
ss[i] = ch1;
flag = ;
}
}
else if(!flag)
break;
else{
if(ss[i] < ch2){
ss[i] = Exhsh[Hsh[ss[i]]+];
flag = ;
}
else{
ss[i] = ch1;
flag = ;
}
}
}
cout << ss << endl;
} return ;
}
D - Alena And The Heater
题意就是给你一串a,一串b,然后满足下面关系式
- 当 ai, ai - 1, ai - 2, ai - 3, ai - 4 > r 而且 bi - 1 = bi - 2 = bi - 3 = bi - 4 = 1时,bi = 0
- 当 ai, ai - 1, ai - 2, ai - 3, ai - 4 < l 而且 bi - 1 = bi - 2 = bi - 3 = bi - 4 = 0时, bi = 1
- 其他情况bi = bi - 1
然后就是让你去找一对满足题意的 l 和 r 。
思路:按照题目的要求,不断缩进l和r的范围即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn=+;
const int INF=1e+;
const int NINF=-1e+;
int a[maxn],b[maxn];
string s;
int l,r;
int main(){
int n;
cin>>n;
l=NINF,r=INF;
for(int i=;i<n;i++){
cin>>a[i];
}
cin>>s;
for(int i=;i<s.size();i++){
b[i]=s[i]-'';
}
for(int i=;i<n;i++){
if(b[i]==&&b[i-]==&&b[i-]==&&b[i-]==&&b[i-]==){
l=max(l,max(a[i]+,max(a[i-]+,max(a[i-]+,max(a[i-]+,a[i-]+)))));
}
else if(b[i]==&&b[i-]==&&b[i-]==&&b[i-]==&&b[i-]==){
r=min(r,min(a[i]-,min(a[i-]-,min(a[i-]-,min(a[i-]-,a[i-]-)))));
}
}
cout<<l<<" "<<r<<endl;
return ;
}
F - I'm bored with life
题意:求GCD(a!,b!);
思路:GCD(a!,b!) = min(a!,b!) = (min(a,b))!;
ll f(int n){
if(n == )
return ;
return n*f(n-);
}
int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
int a,b;
cin>>a>>b;
int n = min(a,b);
cout << f(n) << endl;
return ;
}
G - Crossword solving
题意:就是当把某个字符换成?就代表可以匹配任何字符,问要使得a串在b串中匹配到,最少需要变几个位置,并输出位置;
思路:暴力找a在b每一个位置需要变换几个字符,并存下位置,然后输出最小变换即可。
#define PB push_back
int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
int n,m;
int minn = INT_MAX,ii;
vector<int> q[];
string s1,s2;
int num[] = {};
cin>>m>>n;
cin>>s1>>s2;
GOE(i,,n-m){
GO(j,,m){
if(s1[j] != s2[i+j]){
num[i]++;
q[i].PB(j+);
}
}
}
GOE(i,,n-m){
if(num[i] < minn){
minn = num[i];
ii = i;
}
}
cout << minn << endl;
for(auto &it:q[ii]){
cout << it << ' ';
}
cout << endl;
return ;
}
H - Hacker, pack your bags!
题意:给你一堆时间开始点和结束点,以及花费,问要k小时需要的最小花费,时间不能重叠。
思路:先对所有时间点排序,然后遍历每个时间点的,例如对于第i个,连续时间为x,则去找k-x时间是否存在且满足题意,跟新最小花费,同时用另一个数组维护每个时间段的最小花费。这里排序利用了Tuple的特性所以不需要重构比较函数
#define PB push_back
#define MP make_pair
#define MT make_tuple
vector<tuple<int,int,int>> op; int N, X;
int L[], R[], cost[]; int dp[];
int ans = -; int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
cin>>N>>X;
GO(i,,N){
cin>>L[i]>>R[i]>>cost[i];
op.PB(MT(L[i], , i));
op.PB(MT(R[i], , i));
}
sort(op.begin(), op.end());
int len = op.size();
GO(i,,len){
int o = get<>(op[i]), ind = get<>(op[i]);
if(o == ){ //如果是开始时间点
int dur = R[ind] - L[ind] + , nec = X - dur;
if(nec < || dp[nec] == ) //如果x-d这段时间不存在
continue;
if(ans == - || ans > dp[nec] + cost[ind]) //更新花费
ans = dp[nec] + cost[ind];
}
else{ //如果是结束时间点
int dur = R[ind] - L[ind] + ;
if(dp[dur] == || dp[dur] > cost[ind]) //如果这个时间没有使用或者有更小的花费,更新花费
dp[dur] = cost[ind];
}
}
cout << ans << endl;
return ;
}
ACM团队周赛题解(3)的更多相关文章
- ACM团队周赛题解(1)
这次周赛题目拉了CF315和CF349两套题. 因为我代码模板较长,便只放出关键代码部分 #define ll long long #define MMT(s,a) memset(s, a, size ...
- ACM团队周赛题解(2)
拉了CF583和CF486的两套div2题目 还是先贴宏定义部分 #define MAXN 1000000+5#define MOD 1000000007#define PI (acos(-1.0)) ...
- 2015浙江财经大学ACM有奖周赛(一) 题解报告
2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...
- ACM团队招新赛题解
标程代码全部为C语言编写.代码中的#if LOCAL_ 至#endif为本地一些调试内容,可以忽略. Xenny的A+B(1)[容易][签到] 签到题,做不出的话可能你有点不太适合ACM了. Xenn ...
- SUST_ACM_2019届暑期ACM集训热身赛题解
问题A:Hello SUST! 知识点:基本输入输出 C/C++: #include <stdio.h> int main() { int n; scanf("%d", ...
- FJUT2019暑假第二次周赛题解
A 服务器维护 题目大意: 给出时间段[S,E],这段时间需要人维护服务器,给出n个小时间段[ai,bi],代表每个人会维护的时间段,每个人维护这段时间有一个花费,现在问题就是维护服务器[S,E]这段 ...
- 「POJ3436」ACM Computer Factory题解
题意: 有很多台机器,可以把物件从一种状态改装成另一种状态,初始全为\(0\),最终状态全为\(1\),让你可以拼凑机器,请问最大总性能为多少,且要求输出方案. 题解: 这道题是真的水啊,我不想写太多 ...
- ACM: 限时训练题解-Runtime Error-二分查找
Runtime Error Bahosain was trying to solve this simple problem, but he got a Runtime Error on one ...
- ACM: 限时训练题解-Heavy Coins-枚举子集-暴力枚举
Heavy Coins Bahosain has a lot of coins in his pocket. These coins are really heavy, so he always ...
随机推荐
- Window服务基于Quartz.Net组件实现定时任务调度(二)
前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...
- 配置Oracle透明网关用以连接 SQLServer经验总结
一.情景介绍 业务中设计两个不同的系统,系统1和系统2,两个系统分别使用的是Oracle和SQLServer数据库.现需要在系统1的数据库中直接查询系统2数据库的数据.即在Oracle中执行SQL ...
- 【JavaScript】论一个低配版Web实时通信库是如何实现的之二( EventSource篇)
前情提要 「 话说上回说到!那WebSocket大侠,巧借http之内力,破了敌阵的双工鸳鸯锁,终于突出重围. 然而玄难未了,此时web森林中飞出一只银头红缨枪,划破夜色. "莫非!?&qu ...
- .NETCore Docker实现容器化与私有镜像仓库管理
一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖.相较于虚拟机而 ...
- Filter(过滤器)(有待补充)
Filter(过滤器) 一.Filter(过滤器)简介 Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的 ...
- ASP.NET Core实现对象自动映射-AgileMapper
我们为什么要在对象之间做映射 处于耦合性或者安全性考虑或者性能考虑我们不希望将Model模型传递给他们,我们会在项目中创建一些DTO(Data transfer object数据传输对象),进行数据的 ...
- API 资源隔离系统设计与实现
(马蜂窝技术原创内容,公众号 ID:mfwtech) Part 1 背景 大交通业务需要对接机票.火车票.租车.接送机等业务的外部供应链,供应商的数据接口大部分通过 HTTP.HTTPS 等协议进行通 ...
- 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(三)
(六)工程结构 (一)应用分层 1. [推荐]图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于Web 层,也可以直接依赖于 Service 层,依此类推: 开放接口层: ...
- Python连载35-死锁问题以及解决方式
一.死锁问题 例子 import threading import time lock_1 = threading.Lock() lock_2 = threading.Lock() def f ...
- MAC使用小技巧
同一窗口中显示多个标签页:使用鼠标左右键中间的滑轮点击 修改文件或文件夹的名字:选中文件或文件夹,按下回车,即可修改