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)相关推荐

  1. 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,直到 ...

  2. ACM-ICPC 2018 南京赛区网络预赛

    轻轻松松也能拿到区域赛名额,CCPC真的好难 An Olympian Math Problem 问答 只看题面 54.76% 1000ms 65536K Alice, a student of gra ...

  3. ACM-ICPC 2018 焦作赛区网络预赛 J(二分+JAVA高精)

    传送门 题面: 65536K Jessie and Justin want to participate in e-sports. E-sports contain many games, but t ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 Spare Tire(容斥+公式推)

    A sequence of integer \lbrace a_n \rbrace{an​} can be expressed as: \displaystyle a_n = \left\{ \beg ...

  5. 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 ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 D. Easy Math

    Easy Math 问答问题反馈 只看题面 16.47% 1000ms 262144K Given a positive integers nn , Mobius function \mu(n)μ(n ...

  7. 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)= ...

  8. 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 ...

  9. ACM-ICPC 2018 徐州赛区网络预赛G (单调队列)

    传送门 题面: There's a beach in the first quadrant. And from time to time, there are sea waves. A wave (  ...

最新文章

  1. mysql 不同连接的事务 会嵌套_MySQL——事务
  2. 团队-科学计算器-模块测试过程
  3. EditText获得焦点后,如何关闭软键盘
  4. java jframe 运行_java – 使用JProgressBar运行JFrame
  5. centos ping不通局域网_新手小白初次安装虚拟机,网络不通怎么办,踩过的坑都告诉你...
  6. postman导出Collections后再导入时,打开内容为空
  7. 领域驱动设计 软件核心复杂性应对之道_DDD - 领域驱动设计对软件复杂度的应对(上)...
  8. 临时表空间和数据表空间
  9. 医疗行业的信息化建设
  10. 点积与向量积(点乘与叉乘)
  11. 浅谈大学参加程序竞赛
  12. mysql改为sql_sql - 将MySQL列更改为AUTO_INCREMENT
  13. Scala学习笔记(2)-基础语法
  14. OpenGL Android 安卓 入门 GLES20 初学者 初级 官方
  15. esxi虚拟机的显卡怎么来的_关于ESXI显卡直通(VmDirectPath),使虚拟机变成HTPC的若干经验...
  16. 【AIOT】Haptics Contributes To Contactless HCI
  17. 蓝桥杯 卡片 C语言
  18. 姚老板讲机器学习之SVM算法
  19. 吉林四平市中心医院将引进RFID新生儿定位系统
  20. SpringBoot之:SpringBoot中使用HATEOAS

热门文章

  1. Sublime Text3 无法调出package controll问题
  2. Fedora构建Nginx
  3. BTA | 张犁 :为什么需要一个通用区块链资产平台?
  4. NetApp存储产品---知识笔记
  5. 窥镜下的OLTP以及我们的发现(一)
  6. 芯片SIAT-002测试PCB板设计
  7. 任正非照片刷屏有感:改不了的思维定势
  8. 【转】你是否做了正确的决定?
  9. 【推荐】boss戈 code-nick-python
  10. 关于MAX811MCU监控芯片做复位的理解