QFNU-ACM 2019.5.23组队赛 2019山东省赛复现
A.Calandar
题意:一年12个月,一个月30天,5天一周,已知某天的年月日星期数,求所给年月日的星期数是多少
思路:直接进行计算,其实每个月每年都是等长度的就使得计算的时候忽略年月,可以直接进行日期的比较,因为每个月都有长度相等的六周
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 string day[6]={"Friday","Monday","Tuesday","Wednesday","Thursday","Friday"}; 4 5 int main(){ 6 int t; 7 scanf("%d",&t); 8 while(t--){ 9 long long int year1,month1,day1,year2,month2,day2; 10 string s1,s2; 11 cin>>year1>>month1>>day1>>s1; 12 scanf("%lld %lld %lld",&year2,&month2,&day2); 13 int num=0; 14 for(int i=0;i<5;i++){ 15 if(s1==day[i]){ 16 num=i; 17 18 break; 19 } 20 } 21 if(day1<=day2){ 22 num=(num+(day2-day1)%5)%5; 23 }else{ 24 num=(num+5-(day1-day2)%5)%5; 25 } 26 cout<<day[num]<<endl; 27 } 28 }
C.Wandering Robot
题意:机器人通过'U','D','L','R'进行移动,分别进行上下左右的移动,从坐标(0,0)开始,问在经过k次移动之后,所能达到的最大的距离,距离指|x1-x2|+|y1-y2|
当时想错的地方:1.进行距离最远的判定时,考虑左右的伸缩变换,比如说最后位置落在右上方,而且最远距离要高于最后位置,这样就肯定有向左或者向下的伸缩,计算如果没有这样的伸缩结果是什么,再加上伸缩了多少次,进行加减运算(((可是这样进行计算,在运动复杂的情况下,不一定是满足这样的情况,可能有复杂的圆周运动也 不是这样的,这样计算就会有误差,所以进行计算的时候应该进行计算n-1次最后的位置在哪,然后用最后一次的位置进行循环找到最后一次的位置最高在哪)))
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 const int maxx=2e6+2; 7 string c; 8 int main(){ 9 int t; 10 scanf("%d",&t); 11 while(t--){ 12 long long n,k; 13 cin>>n>>k>>c; 14 long long x = 0,y = 0; 15 long long int sum=0; 16 for(int i=0;i<c.length();i++){ 17 if(c[i]=='R'){ 18 19 x++; 20 } 21 if(c[i]=='L'){ 22 x--; 23 24 } 25 if(c[i]=='U'){ 26 y++; 27 28 } 29 if(c[i]=='D'){ 30 y--; 31 32 } 33 if(sum<((abs(x)+abs(y)))) 34 { 35 sum = abs(x)+abs(y); 36 } 37 } 38 x*=(k-1); 39 y*=(k-1); 40 41 for(int i = 0;i < c.length();i++) 42 { 43 if(c[i]=='R'){ 44 45 x++; 46 } 47 if(c[i]=='L'){ 48 x--; 49 50 } 51 if(c[i]=='U'){ 52 y++; 53 54 } 55 if(c[i]=='D'){ 56 y--; 57 } 58 if(sum<(abs(x)+abs(y))) 59 { 60 sum = abs(x)+abs(y); 61 } 62 } 63 printf("%lld\n",sum); 64 65 } 66 }
D.Game on a Graph
题意:有k个人分成了两组,n个点,m条边,每次一个人选择一条边进行消除,直到某个人使得一个点无法连接其他的边,也就是说使得没有边和这个点链接,这样的话这个人就是输了
当时想错的地方:1.其实当初想的时候就是考虑是不是图论的问题,后来觉得限制条件太多了(((其实本不该想这么多的,大家都是为了规避那种点,肯定会选择除了必须的几条线之外的线,只需要判断如果把多余的线选完了,那么下一个人是哪个组的就好了)))
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 7 int main(){ 8 int t; 9 cin>>t; 10 string s; 11 int n,k,a,b,m; 12 13 while(t--) 14 { 15 cin>>k>>s>>n>>m; 16 int time = (m-n+1)%k; 17 for(int i = 0;i < m;i++) 18 { 19 cin>>a>>b; 20 } 21 if(s[time]=='1') 22 cout<<2<<endl; 23 else cout<<1<<endl; 24 } 25 }
总结:1.这次做题总是把问题给复杂化,要记得化繁为简,抽象出里面的内涵东西,其实这也很难,最好是保证好最初的状态,精神状态要在,就赢了一半了,剩下的就靠平时的多练习才行,还没看清题目,千万不要往难题的方向想,不然肯定会复杂化某个题,就会化简为繁了

浙公网安备 33010602011771号