SRM468
250pt
给定手机0-9按键对应的英文字母(1个对多个),0固定对应空格。然后在给定一些单词。以及一个要处理的串,叫你按照那个串模拟输出结果
思路:
大模拟,写的有点乱
// BEGIN CUT HERE
/* */
// END CUT HERE
#line 7 "T9.cpp"
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std; #define PB push_back
#define MP make_pair #define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i) typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef pair<int,int> PII;
struct oo{
string d, s;
bool operator <(const oo &b)const{
if (s < b.s || (s == b.s && d < b.d)) return true;
return false;
}
}; class T9
{
public:
char d[];
oo S[];
int n, m, k;
string find(string a, int k){
int cnt = ;
for (int i = ; i < m; ++i){
if (S[i].s == a) ++cnt;
if (cnt == k) return S[i].d;
}
return "";
}
string message(vector <string> part, vector <string> dict, vector <string> keystr)
{ n = part.size(), m = dict.size(), k = keystr.size();
for (int i = ; i < n; ++i)
for (int j = ; j < part[i].size(); ++j)
d[(int)part[i][j]] = i + ;
for (int i = ; i < m; ++i){
S[i].d = dict[i];
S[i].s.clear();
for (int j = ; j < dict[i].size(); ++j)
S[i].s.push_back(d[dict[i][j]]);
}
sort(S, S + m);
string ans = "";
int cnt = ;
string tmp = "";
string ks = accumulate(keystr.begin(), keystr.end(), string(""));
int k = ks.size();
for (int i = ; i < k; ++i){
if (ks[i] == '*'){ cnt += ; continue; }
if (ks[i] == '#'){ cnt += ; continue; }
if ((ks[i] < '' || ks[i] > '') && (int)tmp.size() > ){
ans += find(tmp, cnt + );
cnt = ;
tmp.clear();
}
if (ks[i] == '') ans += ' ';
if (ks[i] > '' && ks[i] <= '') tmp += ks[i];
}
if ((int)tmp.size() > ) ans += find(tmp, cnt + );
return ans;
} };
500pt
给定n(n <= 40w)个城市,然后在给定2个数组(需要按照给定的算出来),一个为不坐飞机情况下i->i+1所用的时间,一个为作为飞机所用的时间
求在不超过坐k次飞机的情况下,最少时间(一次可以连续做多个城市,但必须连续,比如i->i+1->i+2..)
思路:
动态规划
dp[i][j][k]表示当前到i城市,做了j次飞机,k(0或1)表示最后一次做没做飞机所用的最少时间
方程应该很好推。但要用滚动数组
// BEGIN CUT HERE
/* */
// END CUT HERE
#line 7 "RoadOrFlightHard.cpp"
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std; #define PB push_back
#define MP make_pair #define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i)
#define Inf (1LL << 50)
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef pair<int,int> PII;
long long rT[], fT[];
long long dp[][][]; class RoadOrFlightHard
{
public:
long long minTime(int N, int roadFirst, int roadProd, int roadAdd, int roadMod, int flightFirst, int flightProd, int flightAdd, int flightMod, int K)
{
rT[] = roadFirst % roadMod;
fT[] = flightFirst % flightMod;
// cout << rT[0] << endl;
for (int i = ; i < N; ++i){
rT[i] = (rT[i-]*roadProd + roadAdd) % roadMod;
fT[i] = (fT[i-]*flightProd + flightAdd) % flightMod;
}
for (int i = ; i <= K; ++i)
dp[][i][] = dp[][i][] = Inf;
dp[][][] = ;
for (int i = ; i < N; ++i){
int cur = i & ;
for (int j = ; j <= K; ++j)
dp[cur^][j][] = dp[cur^][j][] = Inf;
for (int j = ; j <= K; ++j){
if (dp[cur][j][] < Inf){
if(j < K) dp[cur^][j+][] = min(dp[cur^][j+][], dp[cur][j][] + fT[i]);
dp[cur^][j][] = min(dp[cur^][j][], dp[cur][j][] + rT[i]);
}
if (dp[cur][j][] < Inf){
if(j < K) dp[cur^][j+][] = min(dp[cur^][j+][], dp[cur][j][] + fT[i]);
dp[cur^][j][] = min(dp[cur^][j][], dp[cur][j][] + fT[i]);
dp[cur^][j][] = min(dp[cur^][j][], dp[cur][j][] + rT[i]);
}
}
}
long long ans = Inf;
for (int i = ; i <= K; ++i)
for (int j = ; j <= ; ++j)
ans = min(ans, dp[N & ][i][j]);
return ans;
} };
SRM468的更多相关文章
- SRM468 - SRM469(1-250pt, 500pt)
SRM 468 DIV1 250pt 题意:给出字典,按照一定要求进行查找. 解法:模拟题,暴力即可. tag:water score: 0.... 这是第一次AC的代码: /* * Author: ...
随机推荐
- 差异表达分析之FDR
差异表达分析之FDR 随着测序成本的不断降低,转录组测序分析已逐渐成为一种很常用的分析手段.但对于转录组分析当中的一些概念,很多人还不是很清楚.今天,小编就来谈谈在转录组分析中,经常会遇到的一个概念F ...
- System.Runtime.InteropServices.COMException: 检索 COM 类工厂中 CLSID 为 {0002E510-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80040154
这个问题困恼我好几天了,今天终于解决. 开始我在网上左百度右google,都没搜到最终的解决方案,今天我把解决方案贴出来,以供大家分享! 网上有些是报80070005错误的,跟我这个80040154错 ...
- MySQL8.0的安装与配置(Windows 10)
MySQL的下载 进入MySQL官网 https://www.mysql.com/ 选择 DOWNLOAD 到页面底部找到 MySQL Community Edition (GPL) 找到MySQL ...
- [Robot Framework] 通过SikuliLibrary可以获取到图片,但是点击失效
执行时,可以看到鼠标已经移动到图片上了,但是点击失效,日志也没有报错 后来发现是windows权限的问题. 通过打开Control Panel->System and Security-> ...
- swift 官方获取JSON 数据方法
var url = NSURL(string: "http://www.weather.com.cn/data/sk/101120501.html") var data = NSD ...
- oracle 视图带参数
-- create or replace package p_view_param is --参数一 function set_ID(num number) return number; functi ...
- Vim on Mac Terminal
2018-04-15 在Python 里面加标注, 发现Vim强大的两种用法, 比如要在1-5行加标注: 1. 用寻找和替代(basic search and replace),:1, 5s/^/# ...
- linux-ubuntu 下R无法安装rjava模块的原因及解决方案
错误信息: 没有 /usr/lib/jvm/default-java/jre/bin/java 原因: R找不到java作为依赖 解决方案: (1) 如果你没有安装java,请先安装java. (2) ...
- 操作Float的BigDecimal加减乘除
bignum3 = bignum1.add(bignum2); //加 bignum3 = bignum1.subtract(bignum2); 减 bignum3 = bignum1.m ...
- 【WebService】使用JDK开发WebService(二)
WebService的开发手段 1.使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) WebService的组成 1.服务器端 2.客户端 使用JDK开发WebService a. ...