题目链接:https://codeforces.com/gym/101873

C. Joyride

记忆化搜索形式的dp

    #include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert>
//#include <unordered_map>
/* ⊂_ヽ
  \\ Λ_Λ 来了老弟
   \('ㅅ')
    > ⌒ヽ
   /   へ\
   /  / \\
   レ ノ   ヽ_つ
  / /
  / /|
 ( (ヽ
 | |、\
 | 丿 \ ⌒)
 | |  ) /
'ノ )  Lノ */ using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define boost ios::sync_with_stdio(false);cin.tie(0)
#define rep(a, b, c) for(int a = (b); a <= (c); ++ a)
#define max3(a,b,c) max(max(a,b), c);
#define min3(a,b,c) min(min(a,b), c); const ll oo = 1ll<<;
const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = ;
const double esp = 1e-;
const double PI=acos(-1.0);
const double PHI=0.61803399; //黄金分割点
const double tPHI=0.38196601; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} inline void cmax(int &x,int y){if(x<y)x=y;}
inline void cmax(ll &x,ll y){if(x<y)x=y;}
inline void cmin(int &x,int y){if(x>y)x=y;}
inline void cmin(ll &x,ll y){if(x>y)x=y;}
#define MODmul(a, b) ((a*b >= mod) ? ((a*b)%mod + 2*mod) : (a*b))
#define MODadd(a, b) ((a+b >= mod) ? ((a+b)%mod + 2*mod) : (a+b)) /*-----------------------showtime----------------------*/
const int maxn = 1e3+;
int dp[maxn][maxn];
vector<int>mp[maxn];
int x,n,m,T;
int tim[maxn],cost[maxn];
int dfs(int u,int t){
if(t > x) return inf;
if(dp[u][t]!=-) return dp[u][t];
if(u == && t == x) return dp[u][t] = ;
dp[u][t] = inf;
for(int i=; i<mp[u].size(); i++){
int v = mp[u][i];
dp[u][t] = min(dp[u][t], dfs(v, t + T + tim[v]) + cost[v]);
}
dp[u][t] = min(dp[u][t], dfs(u, t+tim[u]) + cost[u]);
return dp[u][t];
}
int main(){
memset(dp, -, sizeof(dp));
scanf("%d", &x);
scanf("%d%d%d", &n, &m, &T);
rep(i, , m) {
int u,v; scanf("%d%d", &u, &v);
mp[u].pb(v);
mp[v].pb(u);
}
rep(i, , n) {
scanf("%d%d", &tim[i], &cost[i]);
}
int ans = dfs(, tim[]) + cost[];
if(ans < inf) printf("%d\n", ans);
else puts("It is a trap.");
return ;
}

E.Perpetuum Mobile

找正环,由于是乘法,所以用log变成加法,还有这题其实是看爱因斯坦那句话,和他助手说的没什么关系,所以要找一个环,环上的乘积大于1,即log >0。于是用spfa判正环就行了。

#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert>
//#include <unordered_map>
/* ⊂_ヽ
  \\ Λ_Λ 来了老弟
   \('ㅅ')
    > ⌒ヽ
   /   へ\
   /  / \\
   レ ノ   ヽ_つ
  / /
  / /|
 ( (ヽ
 | |、\
 | 丿 \ ⌒)
 | |  ) /
'ノ )  Lノ */ using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define boost ios::sync_with_stdio(false);cin.tie(0)
#define rep(a, b, c) for(int a = (b); a <= (c); ++ a)
#define max3(a,b,c) max(max(a,b), c);
#define min3(a,b,c) min(min(a,b), c); const ll oo = 1ll<<;
const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = ;
const double esp = 1e-;
const double PI=acos(-1.0);
const double PHI=0.61803399; //黄金分割点
const double tPHI=0.38196601; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} inline void cmax(int &x,int y){if(x<y)x=y;}
inline void cmax(ll &x,ll y){if(x<y)x=y;}
inline void cmin(int &x,int y){if(x>y)x=y;}
inline void cmin(ll &x,ll y){if(x>y)x=y;}
#define MODmul(a, b) ((a*b >= mod) ? ((a*b)%mod + 2*mod) : (a*b))
#define MODadd(a, b) ((a+b >= mod) ? ((a+b)%mod + 2*mod) : (a+b)) /*-----------------------showtime----------------------*/
typedef pair<int,double> pid;
const int maxn = 1e3+;
vector<pid>mp[maxn]; int vis[maxn];
double dis[maxn];
queue<int>que;
bool spfa(int u){
vis[u] = true;
for(int i=; i<mp[u].size(); i++){
pid tmp = mp[u][i];
int v = tmp.fi;
double w = tmp.se;
if(dis[v] < dis[u] + w){
dis[v] = dis[u] + w;
if(vis[v]) return true;
if(spfa(v)) return true;
}
}
vis[u] = false;
return false;
}
int main(){
int n,m;
scanf("%d%d", &n, &m);
rep(i, , m) {
int u,v; double e;
scanf("%d%d%lf", &u, &v, &e);
mp[u].pb(pid(v, log(e)));
}
for (int i = ; i <= n; ++i) if(spfa(i)) return *puts("inadmissible");
puts("admissible");
return ;
}

H - Ratatoskr

枚举每个点作为根节点的最大深度,如果这个节点原本就有乌鸦,就只能考虑松鼠所在子树的深度,如果这个节点原本没有乌鸦,就只用考虑这棵树的深度

#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert>
//#include <unordered_map>
/* ⊂_ヽ
  \\ Λ_Λ 来了老弟
   \('ㅅ')
    > ⌒ヽ
   /   へ\
   /  / \\
   レ ノ   ヽ_つ
  / /
  / /|
 ( (ヽ
 | |、\
 | 丿 \ ⌒)
 | |  ) /
'ノ )  Lノ */ using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define boost ios::sync_with_stdio(false);cin.tie(0)
#define rep(a, b, c) for(int a = (b); a <= (c); ++ a)
#define max3(a,b,c) max(max(a,b), c);
#define min3(a,b,c) min(min(a,b), c); const ll oo = 1ll<<;
const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = ;
const double esp = 1e-;
const double PI=acos(-1.0);
const double PHI=0.61803399; //黄金分割点
const double tPHI=0.38196601; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} inline void cmax(int &x,int y){if(x<y)x=y;}
inline void cmax(ll &x,ll y){if(x<y)x=y;}
inline void cmin(int &x,int y){if(x>y)x=y;}
inline void cmin(ll &x,ll y){if(x>y)x=y;}
#define MODmul(a, b) ((a*b >= mod) ? ((a*b)%mod + 2*mod) : (a*b))
#define MODadd(a, b) ((a+b >= mod) ? ((a+b)%mod + 2*mod) : (a+b)) /*-----------------------showtime----------------------*/
const int maxn = ;
vector<int>mp[maxn];
int dp[maxn],vis[maxn];
int s,b1,b2,n;
void dfs(int u,int fa){
dp[u] = ;
if(u == s) vis[u] = ;
for(int i=; i<mp[u].size(); i++){
int v = mp[u][i];
if(v == fa) continue;
dfs(v, u);
dp[u] = max(dp[u], dp[v] + );
if(vis[v]) vis[u] = ;
}
}
int main(){
scanf("%d%d%d%d", &n, &s, &b1, &b2);
rep(i, , n-) {
int u,v; scanf("%d%d", &u, &v);
mp[u].pb(v); mp[v].pb(u);
}
int ans = inf;
for(int i=; i<=n; i++)
{
if(i == b1 || i ==b2){
memset(vis, , sizeof(vis));
dfs(i, -); for(int j=; j<mp[i].size(); j++) {
int v = mp[i][j];
if(vis[v]) ans = min(ans, dp[v]);
}
}
else {
dfs(i, -);
ans = min(ans,dp[i]);
}
}
printf("%d\n", ans);
return ;
}

J-Word Clock

状压搜索,注意dfs的次序,还有就是只要关了同步,就不能用scanf

#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert> /* ⊂_ヽ
  \\ Λ_Λ 来了老弟
   \('ㅅ')
    > ⌒ヽ
   /   へ\
   /  / \\
   レ ノ   ヽ_つ
  / /
  / /|
 ( (ヽ
 | |、\
 | 丿 \ ⌒)
 | |  ) /
'ノ )  Lノ */ using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define boost ios::sync_with_stdio(false);cin.tie(0)
#define rep(a, b, c) for(int a = (b); a <= (c); ++ a)
#define max3(a,b,c) max(max(a,b), c);
#define min3(a,b,c) min(min(a,b), c); const ll oo = 1ll<<;
const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = 1e9+;
const double esp = 1e-;
const double PI=acos(-1.0);
const double PHI=0.61803399; //黄金分割点
const double tPHI=0.38196601; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} inline void cmax(int &x,int y){if(x<y)x=y;}
inline void cmax(ll &x,ll y){if(x<y)x=y;}
inline void cmin(int &x,int y){if(x>y)x=y;}
inline void cmin(ll &x,ll y){if(x>y)x=y;} /*-----------------------showtime----------------------*/
int n,h,w;
string str[],t[];
pii dp[][<<],nxt[][<<];
int dis[][]; pii dfs(int u,int state){
if(dp[u][state].fi != - && dp[u][state].se != -) return dp[u][state];
if(state == (<<n) - ) return dp[u][state] = pii(,t[u].length());
pii ans = pii(inf, inf); for(int i=; i<=n; i++){
if(!(state & ( << (i-)))) {
pii tmp; tmp = dfs(i, state | (<<(i-))); int he,wi;
int cen = tmp.fi;
if(tmp.se + dis[u][i] > w) {
he = tmp.fi + ;
wi = t[u].length();
}
else {
he = tmp.fi;
wi = tmp.se + dis[u][i];
} if(he < ans.fi || (he==ans.fi && ans.se > wi)) {
ans.fi = he; ans.se = wi;
nxt[u][state] = pii(i, cen);
}
}
}
return dp[u][state] = ans;
}
bool cmp(string a,string b){
return a.length() < b.length();
}
vector<int> vec[];
int main(){
//scanf("%d%d%d", &h, &w, &n);
boost;
cin>>h>>w>>n;
memset(dis, , sizeof(dis));
memset(dp, -, sizeof(dp));
int sum = ; for(int i=; i<=n; i++) cin>>str[i],sum+=str[i].length();
sort(str+, str++n, cmp);
int tot = ;
for(int i=; i<=n; i++){
if(str[i].length() > w) {
puts("impossible");
return ;
}
int flag = ;
for(int j=i+; j<=n; j++){
if(str[j].find(str[i]) != string::npos) flag = ;
}
if(flag) t[++tot] = str[i];
}
n = tot; for(int i=; i<=n; i++) {
for(int j=; j<=n; j++){
int l1 = t[i].length(), l2 = t[j].length();
int len = min(l1, l2);
for(int k=; k<=len; k++){
if(t[i].substr(l1-k,k) ==t[j].substr(, k)) dis[i][j] = l1 - k;
}
}
} pii tmp = dfs(, );
// cout<<tmp.fi<<" , "<<tmp.se<<endl;
if(tmp.fi>h || tmp.se > w) return *puts("impossible"); int st = ,u = ;
while(st < (<<n) - ) {
int id = nxt[u][st].fi;
// cout<<id<<" "<<nxt[u][st].se<<endl;
vec[nxt[u][st].se].pb(id);
u = id;
st |= ( << (id - ));
} for(int i=; i<=h; i++) {
string ans = "";
for(int j=; j<vec[i].size(); j++){
string tmp = t[vec[i][j]];
int l1 = ans.length(),l2 = tmp.length();
int len = min(l1, l2),q;
for(int k=; k<=len; k++){
if(ans.substr(l1-k,k) ==tmp.substr(, k)) q = k;
}
for(int k=q; k<l2; k++) ans += tmp[k];
}
while(ans.length() < w) ans += "A";
cout<<ans<<endl;
} return ;
} /*
5 10 12
ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN ELEVEN TWELVE
5 10 12
UNO DUE TRE QUATTRO CINQUE SEI SETTE OTTO NOVE DIECI UNDICI DODICI
*/

gym/101873/GCPC2017的更多相关文章

  1. gym 101873

    题还没补完 以下是牢骚:删了 现在只有六个...太恐怖了,我发现四星场我连300人的题都不会啊. C:最短路加一维状态就好了叭..嗯,一开始没看到输出的那句话 那个  "."也要输 ...

  2. Gym 101873F Plug It In(二分图匹配)

    题目链接:http://codeforces.com/gym/101873/problem/F 题意:有n个插孔,m个机器,和一个插板,一个插孔可以连接一个机器,插板可以使一个插孔连接三个机器,找到最 ...

  3. Gym 101873C - Joyride - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://codeforces.com/gym/101873/problem/C 题意: 这是七月的又一个阳光灿烂的日子,你决定和你的小女儿一起度过快乐的一天.因为她真的很喜欢隔壁镇上的 ...

  4. Gym 101873D - Pants On Fire - [warshall算法求传递闭包]

    题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...

  5. Gym 101873G - Water Testing - [皮克定理]

    题目链接:http://codeforces.com/gym/101873/problem/G 题意: 在点阵上,给出 $N$ 个点的坐标(全部都是在格点上),将它们按顺序连接可以构成一个多边形,求该 ...

  6. Gym 101873I - Uberwatch - [DP]

    题目链接:http://codeforces.com/gym/101873/problem/I 题意: 给出 $n(1 \le n \le 300000)$ 个单位时间,每个单位时间给出一个 $x_i ...

  7. Gym 101873K - You Are Fired - [贪心水题]

    题目链接:http://codeforces.com/gym/101873/problem/K 题意: 现在给出 $n(1 \le n \le 1e4)$ 个员工,最多可以裁员 $k$ 人,名字为 $ ...

  8. codeforces gym #101873B. Buildings(Polya定理)

    参考博客: https://blog.csdn.net/liangzhaoyang1/article/details/72639208 题目链接: https://codeforces.com/gym ...

  9. Joyride (spaf)

    题目链接:https://codeforces.com/gym/101873/problem/C spaf的复杂度有点迷,按道理来说,一个简单的spaf在这题的复杂度是1e9,所以不敢写,然后用优先队 ...

随机推荐

  1. webstorm和git安装后,terminal输入git命令,提示'git' 不是内部或外部命令

    最近换了工作,拿到电脑重新搭建编程环境,踩了好多git和sourcetree的坑,就是一直拉不下来代码,晕·~~经过几天的爬坑,终于可以拉取推送代码了!!! 问题:webstorm和git都安装完成, ...

  2. 【Java】Caused by: com.ibatis.sqlmap.client.SqlMapException: There is no statement named *** in this SqlMap.

    如题: 可能原因: 在xxx.xml文件中有两个标签的id命名相同: DAO实现类方法中没有写对应xxx.xml的id名称: 实体映射文件xxx.xml未加入到sqlMap-Config.xml文件中 ...

  3. JS节流和防抖函数

    一. 实现一个节流函数 // 思路:在规定时间内只触发一次function throttle (fn, delay) {  // 利用闭包保存时间  let prev = Date.now()  re ...

  4. C#打开并选择特定类型文件并返回文件名

    public string[] GetOpenFileDialogReturnFileFullName(bool multiSelect = false)         {             ...

  5. Spring MVC浅入浅出——不吹牛逼不装逼

    Spring MVC浅入浅出——不吹牛逼不装逼 前言 上文书说了Spring相关的知识,对Spring来了个浅入浅出,大家应该了解到,Spring在三层架构中主做Service层,那还有Web层,也就 ...

  6. Java中只有值传递,(及值传递与引用传递详解)

    首先呢,我们来说一下值传递与引用传递的区别(这两个玩意儿实在调用函数的时候提到的) 比如说 code( a) code( int a ) code(a)是调用函数,a是我们原本函数的一个值类型,然后使 ...

  7. Redis——基础使用

    Redis总体介绍: Redis特性 Redis(REmote DIctionary Server),是一个开源的内存数据库 持久化:RDB.AOF 主备复制 丰富的数据结构 Lua脚本.事务 Red ...

  8. 使用bibtex为latex论文添加参考文献

    此文以引用Shannon的Prediction  and  Entropy  of Printed  English为例 1. bib文件 1.1 准备工作 进入Google Scholar 点击设置 ...

  9. Spring 2017 Assignments2

    一.作业要求 原版:http://cs231n.github.io/assignments2017/assignment2/ 翻译:http://www.mooc.ai/course/268/lear ...

  10. 【openmp】for循环的break问题

    问题描述:在用openmp并行化处理for循环的时候,便无法在for循环中用break语句,那么我们如何实现这样的机制呢?在stackoverflow上看到一个不错的回答总结一下. volatile ...