牛客多校第三场
A
有鱼则抓鱼,没有鱼也没有鱼饵就尝试用已有的鱼抓鱼。
在没有鱼有鱼饵的时候,有两种选择:
1.用已有鱼饵抓鱼,放弃当前阶段的鱼饵
2.不抓鱼,而去抓鱼饵。
使用第2种,如果游戏结束后,发现还有剩余的鱼饵a个,而这些鱼饵都是来自于(没有鱼,有鱼饵)a个阶段,所以可以安排这a个阶段重复进行这一阶段抓鱼饵,下一阶段抓鱼,于是就可再得到a/2鱼
#include <bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 2e6+10; const int maxM = 1e6+10; const int inf = 0x3f3f3f3f; int T,N; char s[maxn]; void solve(){ int fish = 0,er = 0; for(int i = 1;i<=N;i++){ if(s[i] == '0' && er){ er -= 1; fish += 1; } if(s[i] == '1') er+=1; if(s[i] == '2') fish += 1; if(s[i] == '3') fish += 1; } cout<<fish + er/2<<'\n'; } int main(){ // debug; ios; cin>>T; while(T--){ cin>>N; cin>>(s+1); solve(); } return 0; }
B
把这个字符串想像成一个首尾相连的字符串,用一个指向当前字符串头部的指针,先指向0号位置,如果M 4,就头指针往右移动4次,如果M -4就往左移动4次。在查询的时候,就是头指针+查询位置
#include <bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 2e6+10; const int maxM = 1e6+10; const int inf = 0x3f3f3f3f; char s[maxn]; int p = 0; int T; int main(){ // debug; ios; cin>>s; cin>>T; int len = strlen(s); while(T--){ char op;int v; cin>>op>>v; if(op == 'M'){ if(v>=0) p = (p + v)%len; else p = (p + v + len)%len; }else{ v = (p+v-1)%len; cout<<s[v]<<'\n'; } } return 0; }
C
先找到长度最长的那一条边,为手掌最下面的那条边。然后确定好这条边从大拇指到小指的方向,在计算这条边的两个端点与小手指形成的三角形面积。用叉乘根据这个方向算三角形面积,如果为正代表逆时针,则是右手,否则就是左手。
#include <bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 1e6+10; const int maxM = 1e6+10; const int inf = 0x3f3f3f3f; int T; double x[maxn],y[maxn]; double len(int id1,int id2){ return (x[id2] - x[id1]) * (x[id2] - x[id1]) + (y[id2]-y[id1])*(y[id2]-y[id1]); } void solve(){ int L,id1,id2,R; double mxlen = -1; for(int i = 2;i<=20;i++){ if(len(i-1,i) > mxlen){ id1 = i-1,id2 = i; mxlen = len(i-1,i); } } if(len(1,20) > mxlen){ id1 = 1,id2 =20; mxlen = len(1,20); } if(id1 == 1 && id2 == 20){ L = 2,R = 19; }else{ if(id1 == 1) L = 20; else L = id1-1; if(id2 == 20) R = 1; else R = id2+1; } int a,b,c; if(len(L,id1) < len(id2,R)) a = id1,b = id2,c = R; else a = id2,b = id1,c = L; double s = 0; vector<int> dat = {0,a,b,c}; for(int i = 1;i<=3;i++){ int l = dat[i],r = i<3? dat[i+1]:dat[1]; s += x[l] * y[r] - x[r]*y[l]; } if(s > 0) cout<<"right\n"; else cout<<"left\n"; } int main(){ ios; cin>>T; while(T--){ for(int i = 1;i<=20;i++){ cin>>x[i]>>y[i]; } solve(); } return 0; }
L
#include <bits/stdc++.h> #define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); using namespace std; typedef long long ll; typedef pair<int,int> pii; const int maxn = 1e6+10; const int maxM = 1e6+10; const int inf = 0x3f3f3f3f; string s; int main(){ // debug; ios; cin>>s; transform(s.begin(),s.end(),s.begin(),::tolower); if(s.size()<6 || s.substr(0,6) != "lovely"){ cout<<"ugly\n"; }else{ cout<<"lovely\n"; } return 0; }