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. spark源码阅读---Utils.getCallSite

    1 作用 当该方法在spark内部代码中调用时,会返回当前调用spark代码的用户类的名称,以及其所调用的spark方法.所谓用户类,就是我们这些用户使用spark api的类. 2 内部实现 2.1 ...

  2. java120经典面试题

    经典面试题 -----version 1.0 题注:以下答案仅限本人个人见解,若有错误和建议请多多指教.QQ:1807812486 题目来源 1.什么是Java虚拟机?为什么Java被称作是" ...

  3. asp.net core系列 71 Web架构分层指南

    一.概述 本章Web架构分层指南,参考了“Microsoft应用程序体系结构指南”(该书是在2009年出版的,当时出版是为了帮助开发人员和架构师更快速,更低风险地使用Microsoft平台和.NET ...

  4. 剑指Offer(十八):二叉树的镜像

    剑指Offer(十八):二叉树的镜像 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu ...

  5. test-HTML

    吃葡萄不吐葡萄皮- Hello, This is my first html! baidu yiciyuan 防止嗅探 faststone capture picture movie          ...

  6. CSS文本超出用省略号代替的方法

    { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

  7. nanopi NEO2 学习笔记 3:python 安装 RPi.GPIO

    如果我要用python控制NEO2的各种引脚,i2c 或 spi ,RPi.GPIO模块是个非常好的选择 这个第三方模块是来自树莓派的,好像友善之臂的工程师稍作修改移植到了NEO2上,就放在 /roo ...

  8. HTML(六)框架,颜色,脚本,字符实体,统一资源定位器

    HTML 框架 HTML框架 通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面 Iframe移除边框 使用iframe来显示目标链接页面 RUNOOB.COM HTML 颜色 rgb(255, ...

  9. ZOJ - 3962 - Seven Segment Display-17省赛-数位DP

    传送门:Seven Segment Display 题意:求一个给定区间每个数字的消耗值的和: 思路:数位DP,有点区间和的思想,还有就是这个十六进制,可以用%llx读,还是比较难的: 还有就是到最大 ...

  10. CodeForces 592D Super M DP

    Super M 题解: 定义 dp[u][0] 为遍历完u中的所有节点, 但不回到u点的路径花费值. 定义 dp[u][1] 为遍历完u中的所有节点, 且要回到u点的路径花费值. 转移方程. dp[u ...