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)的更多相关文章

  1. ACM团队周赛题解(1)

    这次周赛题目拉了CF315和CF349两套题. 因为我代码模板较长,便只放出关键代码部分 #define ll long long #define MMT(s,a) memset(s, a, size ...

  2. ACM团队周赛题解(2)

    拉了CF583和CF486的两套div2题目 还是先贴宏定义部分 #define MAXN 1000000+5#define MOD 1000000007#define PI (acos(-1.0)) ...

  3. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  4. ACM团队招新赛题解

    标程代码全部为C语言编写.代码中的#if LOCAL_ 至#endif为本地一些调试内容,可以忽略. Xenny的A+B(1)[容易][签到] 签到题,做不出的话可能你有点不太适合ACM了. Xenn ...

  5. SUST_ACM_2019届暑期ACM集训热身赛题解

    问题A:Hello SUST! 知识点:基本输入输出 C/C++: #include <stdio.h> int main() { int n; scanf("%d", ...

  6. FJUT2019暑假第二次周赛题解

    A 服务器维护 题目大意: 给出时间段[S,E],这段时间需要人维护服务器,给出n个小时间段[ai,bi],代表每个人会维护的时间段,每个人维护这段时间有一个花费,现在问题就是维护服务器[S,E]这段 ...

  7. 「POJ3436」ACM Computer Factory题解

    题意: 有很多台机器,可以把物件从一种状态改装成另一种状态,初始全为\(0\),最终状态全为\(1\),让你可以拼凑机器,请问最大总性能为多少,且要求输出方案. 题解: 这道题是真的水啊,我不想写太多 ...

  8. ACM: 限时训练题解-Runtime Error-二分查找

    Runtime Error   Bahosain was trying to solve this simple problem, but he got a Runtime Error on one ...

  9. ACM: 限时训练题解-Heavy Coins-枚举子集-暴力枚举

    Heavy Coins   Bahosain has a lot of coins in his pocket. These coins are really heavy, so he always ...

随机推荐

  1. java后端_百度一面

    参考: https://www.nowcoder.com/discuss/215891?type=2&order=0&pos=10&page=1 1.会啥框架.不会. 2.锁的 ...

  2. Unity进阶之ET网络游戏开发框架 05-搭建自己的第一个Scene

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  3. HTTP2.0的多路复用和HTTP1.X中的长连接复用区别

    HTTP/2 多路复用 (Multiplexing)    多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息 HTTP1.1 在HTTP/1.1协议中,浏览器客户端在同一时间,针 ...

  4. Flink的JobManager启动(源码分析)

    都知道Flink中的角色分为Jobmanager,TaskManger 在启动脚本里面已经找到了jobmanager的启动类org.apache.flink.runtime.entrypoint.St ...

  5. Linux Web集群架构详细(亲测可用!!!)

    注意:WEB服务器和数据库需要分离,同时WEB服务器也需要编译安装MySQL. 做集群架构的重要思想就是找到主干,从主干区域向外延展. WEB服务器: apache nginx  本地做三个产品 de ...

  6. 【转】[Python小记] 通俗的理解闭包 闭包能帮我们做什么?

    https://blog.csdn.net/sc_lilei/article/details/80464645

  7. springboot报 org.thymeleaf.exceptions.TemplateInputException: Error resolving template "succeed";

    --------------------- 本文转自 林晓风 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Lin_xiaofeng/article/details/ ...

  8. Liunx软件安装之Redis

    Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理.它支持数据结构,如字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志和带有半径查询的地理空间索引.Redi ...

  9. C# 本地xml文件进行增删改查

    项目添加XML文件:FaceXml.xml,并复制到输出目录 FaceXml.xml <?xml version="1.0" encoding="utf-8&quo ...

  10. Enum与最佳単例设计

    1 枚举基础 自定义一个枚举类很简单, 不过类型关键字是 enum, 不是 class, 也不是 interface.public enum Action { UP, DOWN, LEFT, RIGH ...