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 }
View Code

 

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 }
View Code

 

 

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 }
View Code

 

总结:1.这次做题总是把问题给复杂化,要记得化繁为简,抽象出里面的内涵东西,其实这也很难,最好是保证好最初的状态,精神状态要在,就赢了一半了,剩下的就靠平时的多练习才行,还没看清题目,千万不要往难题的方向想,不然肯定会复杂化某个题,就会化简为繁了

posted @ 2020-10-04 22:12  bonel  阅读(115)  评论(0)    收藏  举报