A题分两部分,小于1000和大于1000算出来在相加就可以。
B题是给两个字符串和字母的顺序,判断每一位对应的字符是否是相同或相邻或不相邻,我是讲字符放在一个二维数组里,判断的时候是找到一个的位置,然后在找它旁边的九个位置,如果都没有就不是相邻,有就是相邻。代码:
#include<bits/stdc++.h> using namespace std; char mp[3][9]={{'a','b','c','d','e','f','g','h','i'},{'j','k','l','m','n','o','p','q','r'},{'s','t','u','v','w','x','y','z','0'}}; int find(char a,char b) { int x,y; for(int i=0;i<3;i++) { for(int j=0;j<9;j++) { if(mp[i][j]==a)x=i,y=j; } } for(int i=x-1;i<=x+1;i++) { if(i<0||i>2)continue; for(int j=y-1;j<=y+1;j++) { if(j<0||j>8)continue; if(b==mp[i][j])return 1; } } return 0; } int main() { int t; cin>>t; while(t--) { string s,c; cin>>s>>c; int flag=0; if(s.length()!=c.length())flag=3; else if(s==c)flag=1; else{ flag=2; int l=s.length(); for(int i=0;i<l;i++) { if(find(s[i],c[i])==0) { flag=3; break; } } } cout<<flag<<endl; } }
C题就是遍历一遍,判断前一个和后一个的差的绝对值是否比总的减去这个绝对值大,取小的那个,注意的是每次播放完就要在加一,代码:
#include<bits/stdc++.h> using namespace std; #define LL long long int main() { int t; cin>>t; while(t--) { LL a,b; cin>>a>>b; vector<int>p; p.clear(); int n; for(int i=0;i<b;i++) { cin>>n; if(i==0)++n; p.push_back(n); } LL ans=0; for(int i=1;i<b;i++) { ans+=min((LL)abs(p[i]-p[i-1]),a-abs(p[i]-p[i-1])); ++p[i]; } cout<<ans<<endl; } }
D题,好久没用bfs都忘得差不多了,所以当时也没想到是bfs,就没做出来,赛后看的题解,在当前的地方上下左右搜索,找到最短的步数即可;
E题,用三角函数判断飞镖落在哪片区域,在判断他们到落点的距离,在将他们相加即可。