#include<bits/stdc++.h>usingnamespace std;typedefunsignedlonglong llu;#define PI 3.14159265double coords[26][2]={0};double dists[27][27]={0};// 26下标表示圆心 doubledistCnt(char a,char b){
a |=' '; b |=' ';// convert to lower letters double x1 = coords[a -'a'][0];double y1 = coords[a -'a'][1];double x2 = coords[b -'a'][0];double y2 = coords[b -'a'][1];returnsqrt(pow(x1 - x2,2)+pow(y1 - y2,2));}intmain(){double r =1;
cin >> r;for(int i =0; i <26; i++){char c;double theta =0;
cin >> c >> theta;
c |=' ';// 全变成小写
coords[c -'a'][0]= r *cos(theta * PI /180);
coords[c -'a'][1]= r *sin(theta * PI /180);}for(int i =0; i <=26; i++){for(int j =0; j <=26; j++){if(i == j) dists[i][j]=0;elseif(i ==26|| j ==26) dists[i][j]= r;else dists[i][j]=distCnt(i +'a', j +'a');}}// get string
string str;while(str.empty())getline(cin, str);// need whileint prev =26, cur;double res =0;for(size_t i =0; i < str.size(); i++){if(!isalpha(str[i]))continue;
str[i]|=' ';
cur = str[i]-'a';
res += dists[prev][cur];
prev = cur;}
cout <<llu(ceil(res))<< endl;// rounded up}
BeetleBag
01 背包问题
#include<bits/stdc++.h>usingnamespace std;intmain(){int T =0;
cin >> T;while(T--){int cap =0, n =0;
vector<int> dp, weis, pows;
cin >> cap >> n;
weis.resize(n,0);
pows.resize(n,0);
dp.resize(cap +1,0);for(int i =0; i < n; i++)
cin >> weis[i]>> pows[i];// DPfor(int i =0; i < n; i++){for(int j = cap; j >= weis[i]; j--){
dp[j]=max(dp[j], dp[j - weis[i]]+ pows[i]);}}
cout << dp.back()<< endl;}return0;}
RecXor
给一个矩阵,长
l
l
l 宽
h
h
h
矩阵内都是 连续的 整数编码
矩阵左上角起始数字 为
n
n
n
给两个数字
d
1
d1
d1,
d
2
d2
d2, 以其为对角线做框
这两个矩阵 不公共区域 的 全部数字 的 XOR 值
#include<cstdio>#include<algorithm>usingnamespace std;typedeflonglong ll;
ll xx(ll n){// 表示[1, n]范围的连续整数异或结果if(n %4==0)return n;// mod 4 = 0if(n %4==1)return1;// 1if(n %4==2)return n +1;// 2return0;// 3}intmain(void){int T;scanf("%d",&T );for(int t =1; t <= T; t++){
ll l, h, n, d1, d2;scanf("%lld%lld%lld%lld%lld",&l,&h,&n,&d1,&d2 );
ll first =xx( n + l* h -1)^xx( n -1);
ll second =0;
ll x1, y1, x2, y2;// (y1,x1) -> (y2,x2) // LeftUp -> RightUp
x1 =( d1 - n )/ l +1;
y1 =(d1 - n +1)-( x1 -1)* l;
x2 =( d2 - n )/ l +1;
y2 =( d2 - n +1)-( x2 -1)* l;if( x1 > x2 )swap( x1, x2 );if( y1 > y2 )swap( y1, y2 );// rows: x1 ~ x2// left ~ right 为每个row的连续整数范围 for(int i = x1; i <= x2; i++){
ll left = n + y1 -1+( i -1)* l;
ll right = n + y2 +( i -1)* l -1;
second ^=xx( right )^xx( left -1);}
ll res = first ^ second;printf("%lld\n", res );}return0;}
Gotta Catch 'Em All
二维矩阵
左上和右下 都是 0,其他位置有正有负
路径问题,路径上每个位置 是前面的累加和
任意的位置 (累加) 都得 大于0
求可以从左上 到 右下 的 最小 初始体力
只能 从左往右 和 从上往下 移动
#include<bits/stdc++.h>usingnamespace std;int row, col;
vector<vector<int>> M, dp;boolisValid(int heath_val){
dp[1][1]= heath_val;for(int i =2; i <= row; i++){if(dp[i -1][1]<=0) dp[i][1]= INT_MIN;else dp[i][1]= dp[i -1][1]+ M[i][1];}for(int i =2; i <= col; i++){if(dp[1][i -1]<=0) dp[1][i]= INT_MIN;else dp[1][i]= dp[1][i -1]+ M[1][i];}for(int i =2; i <= row; i++){for(int j =2; j <= col; j++){int tmp =max(dp[i -1][j], dp[i][j -1]);if(tmp <=0) dp[i][j]= INT_MIN;else dp[i][j]= tmp + M[i][j];}}return dp.back().back()>0;}intmain(){
cin >> row >> col;
M.resize(row +1, vector<int>(col +1,0));for(int i =1; i <= row; i++){for(int j =1; j <= col; j++){
cin >> M[i][j];}}// DP + binary Searching
dp.resize(row +1, vector<int>(col +1,0));int left =1, right = INT_MAX, ans = INT_MAX;while(left < right){int mid = left +(right - left)/2;if(isValid(mid)){
ans = mid;
right = mid;}else{
left = mid +1;}}
cout << ans << endl;return0;}
Let’s Cheer Up Bob
Tic-tac-toe 游戏: 3x3 网格的3子棋
陪丈母娘打牌的意思
Bob有一个下子 优先级,只按这个顺序下子
Bob先下,你得让Bob尽快赢,输出你每次下子的位置
采用BFS,层定义为 Bob 下子的 多少
一旦结束,就代表 最快就赢了
#include<bits/stdc++.h>usingnamespace std;struct state {char board[3][3];bool bobTurn;int moveNum;// BFS的深度
vector<pair<int,int>> moves;};int prior[9][2]={0};
queue<state> Q;// true: label Win; false: elseintwhoWins(state s,char lab ='x'){for(int i =0; i <3; i++){int cnt1 =0;for(int j =0; j <3; j++){if(s.board[i][j]== lab)
cnt1++;}if(cnt1 ==3)returntrue;}for(int j =0; j <3; j++){int cnt1 =0;for(int i =0; i <3; i++){if(s.board[i][j]== lab)
cnt1++;}if(cnt1 ==3)returntrue;}int cnt1 =0, cnt2 =0;for(int i =0; i <3; i++){if(s.board[i][i]== lab) cnt1++;if(s.board[i][2- i]== lab) cnt2++;}if(cnt1 ==3|| cnt2 ==3)returntrue;returnfalse;}intmain(){for(int i =0; i <9; i++){
cin >> prior[i][0]>> prior[i][1];
prior[i][0]--;
prior[i][1]--;}
state init_state;for(int i =0; i <3; i++){for(int j =0; j <3; j++){
init_state.board[i][j]='.';}}
init_state.moveNum =0;
init_state.bobTurn =true;
Q.push(init_state);while(!Q.empty()){auto cur_state = Q.front(); Q.pop();bool isEnd =whoWins(cur_state,'x');// Bob Winbool isEnd2 =whoWins(cur_state,'o');// I Winif(isEnd2)continue;if(isEnd){// finishedfor(size_t i =0; i < cur_state.moves.size(); i++){
cout << cur_state.moves[i].first +1<<" "<< \
cur_state.moves[i].second +1<< endl;}return0;}if(cur_state.bobTurn){// Bob's Turnsint lastMove = cur_state.moveNum;bool moveFound =false;for(int i = lastMove; i <9&&!moveFound; i++){int y = prior[i][0];int x = prior[i][1];if(cur_state.board[y][x]=='.'){
cur_state.board[y][x]='x';
cur_state.moveNum = i +1;
cur_state.bobTurn =false;
moveFound =true;
Q.push(cur_state);}}}else{// My turnfor(int i =0; i <3; i++){for(int j =0; j <3; j++){if(cur_state.board[i][j]!='.')continue;
state new_state = cur_state;
new_state.board[i][j]='o';
new_state.bobTurn =true;
new_state.moves.push_back(make_pair(i, j));
Q.push(new_state);}}}}return0;}