ACM-ICPC 2018 北京赛区网络预赛(A B C D H)
ACM-ICPC 2018 北京赛区网络预赛(A B C D H)
自闭症患者
A. Saving Tang Monk II
题目链接
题面:
划掉
题意:
大搜索,队友写的
思路:
大搜索,队友写的
AC代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
char pic[102][102];
int dp[6][102][102];
struct step {int x, y, w;step() {}step(int _x, int _y, int _w) : x(_x), y(_y), w(_w) {}
};
queue<step> bfs;
int dirx[4] = { -1, 0, 1, 0 };
int diry[4] = { 0, 1, 0, -1 };
int main() {int x, y;while (scanf("%d %d", &x, &y) != EOF && x > 0 && y > 0) {for (int i = 0; i < x; i++) {scanf("%s", pic[i]);}memset(dp, 0x3f3f3f3f, sizeof(dp));while (!bfs.empty()) bfs.pop();int sx, sy, tx, ty;for (int i = 0; i < x; i++) {for (int j = 0; j < y; j++) {if (pic[i][j] == 'S') sx = i, sy = j;if (pic[i][j] == 'T') tx = i, ty = j;}}dp[0][sx][sy] = 0;bfs.push(step(sx, sy, 0));while (!bfs.empty()) {step topx = bfs.front();bfs.pop();for (int k = 0; k < 4; k++) {int nt = dp[topx.w][topx.x][topx.y];int nx = topx.x + dirx[k];int ny = topx.y + diry[k];int nw = topx.w;if (nx >= 0 && ny >= 0 && nx < x && ny < y) {if (pic[nx][ny] == '#') {if (nw == 0) continue;nw--;nt++;} else if (pic[nx][ny] == 'B') {if (nw < 5) nw++;} if (pic[topx.x][topx.y] != 'P') {nt++;}if (nt < dp[nw][nx][ny]) {dp[nw][nx][ny] = nt;if (pic[nx][ny] != 'T') {bfs.push(step(nx, ny, nw));}}}}}
// for (int w = 0; w <= 5; w++) {// for (int i = 0; i < x; i++) {// for (int j = 0; j < y; j++) {// printf("%d ", dp[w][i][j]);
// }printf("\n");
// }printf("\n\n");
// }int ans = 0x3f3f3f3f;for (int i = 0; i <= 5; i++) {ans = min(ans, dp[i][tx][ty]);}printf("%d\n", ans == 0x3f3f3f3f ? -1 : ans);}return 0;
}
B. Tomb Raider
题目链接
题面:
划掉
题意:
寻址n个串的最长公共子序列。
思路:
拿一个最短串枚举所有子序列,在其他串中查找。暴力
AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <set>
#include <cmath>
#include <map>using namespace std;typedef long long LL;const int MAXN = 1000005;string s[12];
int use[10];
string ans;int main()
{int n;string temp;string now;while(cin >> n){for(int i = 0; i < n; ++i){cin >> s[i];}for(int i = 1; i < n; ++i){s[i] += s[i];//cout << s[i] << endl;}int len = s[0].length();int maxx = (1<<len);ans = "";for(int i = 0; i < maxx; ++i){temp = "";int cnt = 0;for(int j = 0; j < len; ++j){if(i&(1<<j)){temp += s[0][j];}}int tl = temp.length();for(int x = 0; x < tl; ++x){now = temp.substr(x+1, tl-(x+1)) + temp.substr(0, x);now.push_back(temp[x]);int nl = now.length();//cout << now << endl;bool flag = true;bool tempflag;for(int j = 1; j < n; ++j){int lj = s[j].length()/2;tempflag = false;for(int st = 0; st < lj; ++st){if(s[j][st] != now[0]) continue;int cur = 1;if(nl == 1){tempflag = true;break;}for(int k = st+1; k < st+lj; ++k){if(s[j][k] == now[cur]){++cur;if(cur == nl){tempflag = true;break;}}}if(tempflag) break;}if(!tempflag){flag = false;break;}}if(flag){//cout << now << endl;if(now.length() > ans.length()){ans = now;reverse(now.begin(), now.end());if(now < ans){ans = now;}}else if(now.length() == ans.length()){if(now < ans){ans = now;}reverse(now.begin(), now.end());if(now < ans){ans = now;}}}}}if(ans == ""){cout << 0 << endl;}else{cout << ans << endl;}}
}
C. Cheat
题目链接
题面:
划掉
题意:
斗地主。
思路:
大模拟,队友写的。
AC代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int dictOrder[] = {9, 1, 2, 3, 4, 5, 6, 7, 8, 0, 10, 12, 11};
int cards[4][13];
int fuck[4][13];
int tables[13];
char fv[5];
int rankNow = 0, rounderRank = -1, rounderCnt = -1, roundext = -1, roundNow = 0;
int getcard(char* sp) {#define card(a, b) if (strcmp(sp, a) == 0) return b;card("A", 0); card("2", 1); card("3", 2); card("4", 3); card("5", 4); card("6", 5);card("7", 6); card("8", 7); card("9", 8); card("10", 9); card("J", 10); card("Q", 11);card("K", 12);return -1;
#undef card
}
const char* getcardII(int sp) {#define card(b, a) if (sp == a) return b;card("A", 0); card("2", 1); card("3", 2); card("4", 3); card("5", 4); card("6", 5);card("7", 6); card("8", 7); card("9", 8); card("10", 9); card("J", 10); card("Q", 11);card("K", 12);return "?";
#undef card
}
int findSmallest(int p) {for (int i = 0; i < 13; i++) {if (cards[p][dictOrder[i]] > 0) {return dictOrder[i];}}return -1;
}
int findNextCard(int p) {for (int i = 0; i < 13; i++) {if (fuck[p][i] > 0) {fuck[p][i]--;return i;}}return -1;
}
void putOneDictSmallest(int p) {int ck = findSmallest(p);if (ck >= 0) {cards[p][ck]--;rounderCnt = 1;rounderRank = ck;tables[ck]++;}
}
void putSomeTrueCard(int p, int cnt) {rounderCnt = cnt;cards[p][rankNow] -= cnt;rounderRank = rankNow;tables[rankNow] += cnt;
}
bool action(int p, bool realDo, int rankx) {if (realDo) roundext = -1;if (p == 0) {if (cards[p][rankx] > 0) {if (realDo) putSomeTrueCard(p, 1);return true;} else {if (realDo) putOneDictSmallest(p);return false;}} else if (p == 1) {if (cards[p][rankx] > 0) {if (realDo) putSomeTrueCard(p, cards[p][rankx]);return true;} else {if (realDo) putOneDictSmallest(p);return false;}} else if (p == 2) {if (cards[p][rankx] > 0) {if (realDo) putSomeTrueCard(p, cards[p][rankx]);return true;} else {if (realDo) {int nums = 9999, idx = -1;for (int i = 0; i < 13; i++) {if (cards[p][dictOrder[i]] > 0) {if (cards[p][dictOrder[i]] < nums) {nums = cards[p][dictOrder[i]];idx = dictOrder[i];}}}rounderCnt = cards[p][idx];cards[p][idx] = 0;rounderRank = idx;tables[idx] += rounderCnt;}return false;}} else if (p == 3) {if (cards[p][rankx] > 2) {if (realDo) putSomeTrueCard(p, cards[p][rankx]);return true;} else {if (realDo) {putSomeTrueCard(p, cards[p][rankx]);roundext = findSmallest(p);if (roundext >= 0) {cards[p][roundext]--;tables[roundext]++;}return roundext == -1;}return false;}}
}
bool shouldFuck(int p) {if (p == 0) {if ((roundNow + 1) % 4 == p && !action(p, false, (rankNow + 1) % 13)) {return true;} else {return cards[p][rankNow] + (rounderCnt + (roundext >= 0)) > 4;}} else if (p == 1) {return (roundNow + 1) % 4 == p && !action(p, false, (rankNow + 1) % 13);} else if (p == 2) {return cards[p][rankNow] == 4;} else if (p == 3) {return findSmallest(roundNow % 4) == -1;}
}
void getAllCards(int p) {for (int i = 0; i < 13; i++) {cards[p][i] += tables[i];tables[i] = 0;}
}
void printCards() {memcpy(fuck, cards, sizeof(cards));for (int i = 0; i < 4; i++) {for (int k = 0; k < 998; k++) {int next = findNextCard(i);if (next == -1) {if (k == 0) printf("WINNER");printf("\n");break;}else {if (k > 0) printf(" ");printf("%s", getcardII(next));}}}
}
int main() {bool gaming = true;while (gaming) {memset(cards, 0, sizeof(cards));memset(tables, 0, sizeof(tables));for (int i = 0, j = -1; i < 52; i++) {if (i % 13 == 0) j++;if (scanf("%s", fv) == EOF) {gaming = false;break;}int cc = getcard(fv);if (cc >= 0) cards[j][cc]++;}rankNow = 0, roundNow = 0, rounderRank = -1, rounderCnt = -1, roundext = -1;if (gaming) {while (true) {//printf("round: %s\n", getcardII(rankNow));bool really = action(roundNow % 4, true, rankNow);//printCards();//printf("rankcnt %d ext: %s\n", rounderCnt, getcardII(roundext));//printf("p%d is really: %d\n", roundNow % 4, really);for (int j = roundNow + 1; j < roundNow + 4; j++) {if (shouldFuck(j % 4)) {//printf("p%d do fuck!\n", j % 4);if (!really) {getAllCards(roundNow % 4);} else {getAllCards(j % 4);}break;}}rankNow = (rankNow + 1) % 13;if (findSmallest(roundNow % 4) == -1) break;roundNow++;}printCards();}}return 0;
}
D. 80Days
题目链接
题面:
划掉
题意:
n个成环的城市,到达第i个城市获得aia_iai,离开丢掉bib_ibi,初始有c,全程拥有值不能为负数,问是否可行,可行就输出最小的出发点。
思路:
尺取法,维护一个连续段的区间以及C+在该区间旅游费用和,左端点不变,右端点向右移,如果遇到无法进行的情况则移动左端点。
AC代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <set>
#include <cmath>
#include <map>using namespace std;typedef long long LL;const int MAXN = 1000005;LL a[2*MAXN];
LL b[2*MAXN];int main()
{int t;cin >> t;int n;LL c;while(t--){scanf("%d%lld", &n, &c);for(int i = 1; i <= n; ++i){scanf("%lld", &a[i]);a[n+i] = a[i];}for(int i = 1; i <= n; ++i){scanf("%lld", &b[i]);b[n+i] = b[i];}int l = 1, r = 1;LL now = c + a[1];bool flag = false;while(true){now -= b[r];while(now < 0 && l < r){now -= a[l];now += b[l];l++;}if(l == r && now < 0){l++;r++;now = c + a[l];continue;}r++;if(r-l == n){flag = true;break;}now += a[r];while(now < 0 && l < r){now -= a[l];now += b[l];l++;}if(l > n){flag = false;break;}}if(flag){printf("%d\n", l);}else{printf("-1\n");}}
}
H. K-Demensional Foil II
题目链接
题面:
划掉
题意:
K维空间,给定一个曼哈顿距离意义下的球,N个点,求这些点到该球上在欧几里得距离下最小的点。
思路:
直接考虑对欧几里得距离进行缩小,那么可以写成一个类似于方差形式的表达式,那么要使得该表达式最小,令这K维当中对表达式值贡献最大的值减小。
问题变形为满足哈密顿距离小于R时放缩该表达式使得其值最小,二分即可。
AC代码:
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <stack>
#include <bitset>using namespace std;#define FSIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define DEBUG(a) cout<<"DEBUG: "<<(a)<<endl;
#define ll long long
#define ld long double
#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define REP(i,st,ed) for(int i=st;i<=ed;++i)
#define IREP(i,st,ed) for(int i=ed;i>=st;--i)
#define TCASE(T) cin>>T;while(T--)const int MAXN = 105;
const int MOD = 2333333 ;
const int INF = 1e9+7;int _;using namespace std;const double EPS = 1e-6;double foil[MAXN];
double spcf[MAXN];
double go[MAXN];
bool mk[MAXN];
int N, K;
double R;int main()
{//freopen("test.in","r",stdin);//freopen("test.out","w+",stdin);TCASE(_){scanf("%d%d",&N,&K);scanf("%lf",&R);REP(i,1,K) scanf("%lf",&foil[i]);REP(t,1,N){REP(i,1,K){scanf("%lf",&spcf[i]);go[i] = fabs(spcf[i]-foil[i]);mk[i] = (spcf[i]>=foil[i]);}double minn = 0;double maxn = 1e8;double mid, tmp;while(minn+EPS<=maxn){mid = (minn+maxn)/2.0;tmp = 0;REP(kk,1,K) tmp+=max(0.0,go[kk]-mid);if(tmp<=R) maxn = mid-EPS;else minn = mid+EPS;}REP(i,1,K){if(go[i]>=maxn) go[i]=maxn;if(mk[i]) tmp = spcf[i]-go[i];else tmp = spcf[i]+go[i];printf("%.5f ",tmp);}printf("\n");}}return 0;
}
ACM-ICPC 2018 北京赛区网络预赛(A B C D H)相关推荐
- ICPC 2018 焦作赛区网络预赛G Give Candies 组合数学隔板法+欧拉降幂
G Give Candies 计蒜客 G Give Candies 题意 n n n个糖果, n n n个人从 1 1 1~ n n n编号,每次给一个人发糖可以发任意数量但不能小于 1 1 1,直到 ...
- ACM-ICPC 2018 南京赛区网络预赛
轻轻松松也能拿到区域赛名额,CCPC真的好难 An Olympian Math Problem 问答 只看题面 54.76% 1000ms 65536K Alice, a student of gra ...
- ACM-ICPC 2018 焦作赛区网络预赛 J(二分+JAVA高精)
传送门 题面: 65536K Jessie and Justin want to participate in e-sports. E-sports contain many games, but t ...
- ACM-ICPC 2018 沈阳赛区网络预赛 Spare Tire(容斥+公式推)
A sequence of integer \lbrace a_n \rbrace{an} can be expressed as: \displaystyle a_n = \left\{ \beg ...
- ACM-ICPC 2018 徐州赛区网络预赛 Features Track(STL二维map)
Morgana is learning computer vision, and he likes cats, too. One day he wants to find the cat moveme ...
- ACM-ICPC 2018 徐州赛区网络预赛 D. Easy Math
Easy Math 问答问题反馈 只看题面 16.47% 1000ms 262144K Given a positive integers nn , Mobius function \mu(n)μ(n ...
- ACM-ICPC 2018 徐州赛区网络预赛 D. EasyMath
ACM-ICPC 2018 徐州赛区网络预赛 D. EasyMath 做法: \[f(m,n) = \sum _{i=1}^{m} \mu(in) = \sum_{i=1}^{m}[gcd(i,n)= ...
- ACM-ICPC 2018 焦作赛区网络预赛 H题 String and Times(SAM)
Now you have a string consists of uppercase letters, two integers AA and BB. We call a substring won ...
- ACM-ICPC 2018 徐州赛区网络预赛G (单调队列)
传送门 题面: There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( ...
最新文章
- mysql 不同连接的事务 会嵌套_MySQL——事务
- 团队-科学计算器-模块测试过程
- EditText获得焦点后,如何关闭软键盘
- java jframe 运行_java – 使用JProgressBar运行JFrame
- centos ping不通局域网_新手小白初次安装虚拟机,网络不通怎么办,踩过的坑都告诉你...
- postman导出Collections后再导入时,打开内容为空
- 领域驱动设计 软件核心复杂性应对之道_DDD - 领域驱动设计对软件复杂度的应对(上)...
- 临时表空间和数据表空间
- 医疗行业的信息化建设
- 点积与向量积(点乘与叉乘)
- 浅谈大学参加程序竞赛
- mysql改为sql_sql - 将MySQL列更改为AUTO_INCREMENT
- Scala学习笔记(2)-基础语法
- OpenGL Android 安卓 入门 GLES20 初学者 初级 官方
- esxi虚拟机的显卡怎么来的_关于ESXI显卡直通(VmDirectPath),使虚拟机变成HTPC的若干经验...
- 【AIOT】Haptics Contributes To Contactless HCI
- 蓝桥杯 卡片 C语言
- 姚老板讲机器学习之SVM算法
- 吉林四平市中心医院将引进RFID新生儿定位系统
- SpringBoot之:SpringBoot中使用HATEOAS