签到中的签到题
A:传送门:https://ac.nowcoder.com/acm/contest/5278/A
思路:用一个数组a[4]存放四位选手的分数,然后先做一个排序,首尾组合,中间两个组合即可,然后相减,结果加绝对值,因为可能减下来为负数(在这里竟然WA了一下,orz)。
#include<bits/stdc++.h> using namespace std; int main(){ std::ios::sync_with_stdio(false); cin.tie(NULL); int a[4]; cin>>a[0]>>a[1]>>a[2]>>a[3]; sort(a,a+4); int ans=(a[0]+a[3])-(a[1]+a[2]); ans=abs(ans); cout<<ans<<endl; return 0; }
B:传送门:https://ac.nowcoder.com/acm/contest/5278/B
思路:对输入的数据逐步筛选,然后对满足的根据要求进行排序,然后输出即可,用结构体存储数据。
#include<bits/stdc++.h> using namespace std; struct node{ int data; int number; double temp; }Node[120]; bool cmp(node a,node b){ if(a.data!=b.data) return a.data>b.data; else if(a.temp!=b.temp) return a.temp>b.temp; else return a.number<b.number; } int main(){ std::ios::sync_with_stdio(false); cin.tie(NULL); int n; scanf("%d",&n); int ans=0; for(int i=0;i<n;i++){ scanf("%d%d%lf",&Node[i].data,&Node[i].number,&Node[i].temp); if(Node[i].temp>=38.0) ans++; } sort(Node,Node+n,cmp); cout<<ans<<endl; for(int i=0;i<n;i++){ if(Node[i].temp>=38.0){ printf("%d %d %.1lf\n",Node[i].data,Node[i].number,Node[i].temp); } } return 0; }
C:传送门:https://ac.nowcoder.com/acm/contest/5278/C
纸老虎题,本以为要用DP解,看来是我想多了。
思路:如果两字串的长度不一样的话,输出更长的那个字符串的长度,如果是一样的话,那么除非他们两是完全一样的字符串(是就输出-1),否则任意输出其中一个的长度即可。
#include<bits/stdc++.h> using namespace std; int main(){ std::ios::sync_with_stdio(false); cin.tie(NULL); string a,b; cin>>a>>b; if(a==b) cout<<"-1"<<endl; else{ int len1=a.length(),len2=b.length(); if(len1>len2) cout<<len1<<endl; else cout<<len2<<endl; } return 0; }
D:传送门:https://ac.nowcoder.com/acm/contest/5278/D
思路:从小到大开始找,如果n=1,输出0或1,如果是2,输出0 11,这两个要特判,然后从3开始,输出0 11 101,n=4:0 11 101 1001,依次类推,就是两端为1,中间补相应个0即可,也可反过来。这么做的原因主要是题目说了,从头部和尾部删除一些字符就算是字串,那么我就从中间添加即可避免产生字串。
特别注意2也要进行特判,又在这被坑了两次,orz
#include<bits/stdc++.h> using namespace std; int main(){ std::ios::sync_with_stdio(false); cin.tie(NULL); int n; cin>>n; if(n==1){ cout<<"1"<<endl; cout<<"1"<<endl; } else if(n==2){ cout<<"2"<<endl; cout<<"1"<<endl; cout<<"00"<<endl; } else{ int k=n-1; cout<<k<<endl; for(int j=2;j<=n;j++){ for(int i=1;i<=j;i++){ if(i==1||i==j) cout<<"1"; else cout<<"0"; } cout<<endl; } } return 0; }
E:传送门:https://ac.nowcoder.com/acm/contest/5278/E
思路:吃到的那一轮还剩多少就减去相应的美味度,先计算总的美味度,然后减去损失的美味度即可。如对于n,吃n轮,第二轮开始减,第二轮少n-1,第三轮少n-2,第四轮少n-3,第n轮少1,然后就是1,2,3...n-1的前n-1项求和就行了,最后用总的减去少了的即可,但用这种方法要注意开long long。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll a[100010]; int main(){ std::ios::sync_with_stdio(false); cin.tie(NULL); ll n; cin>>n; ll ans=0; for(int i=0;i<n;i++){ cin>>a[i]; ans+=a[i]; } ll temp=(n-1)*n/2; ans=ans-temp; cout<<ans<<endl; return 0; }
F:传送门:https://ac.nowcoder.com/acm/contest/5278/F
两种方法,第一种打表,当然,这是没办法中的办法。我今天主要介绍第二种方法,也是常规方法。
对于在范围内的数据,我们最最想要的就是如何确定一年中的父亲节和母亲节。那么,如何做呢?
首先,我们要明白,闰年是可以被4不能被100整除,能被400整除的。
我们以母亲节为例:2000年母亲节在5.14,那么2001年的我们如何求呢?我们知道,2000-2001的母亲节之间相差365天,(这个要根据平年和闰年来计算,平年365,闰年366)而365%7==1,那么我们就可以知道,如果两年的节日之间相差365,天数就是在前一年的基础上提前一天,如果是366,那么天数就往前提前两天。然后因为是以星期为标准,那么就有一个周期为7。
然后我们又观察发现,母亲节的日期总是在8-14范围内的,父亲节的日期总是在21-15内的。我们就能得到这两个式子:mo=14-((y-2000)+(y-2000)/4)%7;(y-2000)表示的是要提前几天,而(y-2000)/4是指出现了几个闰年,就是要多提前几天。fa=21-((y-1998)+(y-2000)/4+1)%7;然后,我们会发现,父亲节的日期和母亲节的日期表达式是不一样的,原因就是2000年恰好是我们母亲节的日期周期的开始,而父亲节周期的开始要从1998年算起,(1998父亲节的日期是21号,然后逐年减)这样,我们就得从1998年算起,这个加1主要是考虑了2000年的,然后还得分平年和闰年来计算即可。
接下来,还要再讨论2100年的情况了,至于为什么会想到要特判这个年份,WA多了自然要考虑到边界的情况。如果我们输入的情况的答案可能在2101年的父亲或母亲节的话,那么我们那个式子就会有错,说到底,还是我们那个式子有取巧的地方,我们没有区分可被4整除而不能被100整除的,而2100恰好就是可以被4整除,而能被100整除,2100年不是闰年。我们之所以可以用那个式子的原因就是在2000-2100年内除了2100年,能被4整除的年份都是闰年,如果范围大了就不好说了。然后经过计算我们可以知道2100年的父亲节日期为21,母亲节为9.
讨论完这些特殊的情况之后,我们终于可以开始讨论单独一年的情况了。
在一年中,我们先计算出这一年的父亲节和母亲节。假如是月份为1-4,然后,输出的节日肯定是母亲节;假如是5月份,如果输入的d(输入的日子)<mo,那么肯定还是输出母亲节。如果大于mo,那么就输出父亲节。如果是6月份,d<fa,输出父亲节,否则,我们就要考虑输出下一年的母亲节,然后我们要重新计算下一年的母亲节的日期是多少,如果是7-12月份,我们还是要先计算下一年的母亲节是多少,然后输出即可,但是,对于如果要输出的节日在下一年的情况,我们要特判,特判,特判2099年和2100年的情况,如果是2099年的下半年,也就是输出2100年的母亲节的日期。我们令mo=9(我们要先计算一下),如果是2100年的下半年的话,我们就令mo=8,也是自己计算一下,然后,其他的年份的话就按那个计算mo的式子来就行了。
代码如下:
#include<bits/stdc++.h> using namespace std; int main(){ //ifstream cin("aaa.txt"); int t; cin>>t; while(t--){ int y,m,d; cin>>y>>m>>d; int mo=14-((y-2000)+(y-2000)/4)%7; //计算这年的母亲节的日子 int fa=21-((y-1998)+(y-2000)/4+1)%7; if(y==2100){ mo=9,fa=20; } if(m>=1&&m<=4){ printf("Mother's Day: May %dth, %d\n",mo,y); continue; } if(m==5){ if(d<mo) printf("Mother's Day: May %dth, %d\n",mo,y); else{ if(fa!=21) printf("Father's Day: June %dth, %d\n",fa,y); else printf("Father's Day: June %dst, %d\n",fa,y); } continue; } if(m==6){ if(d<fa){ if(fa==21) printf("Father's Day: June %dst, %d\n",fa,y); else printf("Father's Day: June %dth, %d\n",fa,y); } else{ if(y==2100) mo=8; else if(y==2099) mo=9; else mo=14-((y+1-2000)+(y+1-2000)/4)%7; printf("Mother's Day: May %dth, %d\n",mo,y+1); } continue; } if(m<=12&&m>=7){ if(y==2100) mo=8; else if(y==2099) mo=9; else mo=14-((y+1-2000)+(y-2000+1)/4)%7; printf("Mother's Day: May %dth, %d\n",mo,y+1); continue; } } return 0; }
这种解法我是参照题解中的另一位同志的思路写的,感觉这种解法思路比较清晰,所以就对他的代码进行了一个解读,希望有帮助吧!