总结:4.18下午VP一场,AC了AB两题,卡在了C题,开始读错题了,但也是死活做不出来,前两道可以说都是思维题吧,思路有点模糊,但是都写对了
A. Working Week
思路:思维题,要求3个连续工作日之间最大的最小值,可以先减去3天休息日和至少包括的3天,剩下的时间便可以任意分配,为使最小值最大,便可使剩下的分为三等份,第一个分0份(1天),第二个分1份(1天+1份),第三个分2份(1天+2份)
#include<iostream>
using namespace std;
int main(){
int T,n;
cin>>T;
while(T--){
cin>>n;
cout<<n/3-2<<'\n';
}
return 0;
}
B. Tea with Tangerines
思路:双指针,和刚打过的上一场比赛中的C题很像,双指针可以解决(第一次是尝试使用multiset解决,但发现太复杂,遂用双指针),不断分解最大值,最大值每次减去二倍的最小值减一,直到该值小于二倍的最小值,右指针小于二倍的最小值为止
#include<iostream>
#include<algorithm>
using namespace std;
const int N=105;
int a[N];
int main(){
int T,n,ans;
cin>>T;
while(T--){
ans=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int l=1,r=n;
while(2*a[l]<=a[r]){
if(a[r]%(2*a[l]-1)){
ans+=(a[r]/(2*a[l]-1));
}else{
ans+=(a[r]/(2*a[l]-1)-1);
}
r--;
}
cout<<ans<<'\n';
}
return 0;
}
C. Phase Shift
思路:可以用两个map解决,一个为加密mp,一个为解密mmp,最主要的是判断是否成环,是这个题的关键,从当前字符开始,当回到这个字符或者断开时截至,判断是否成环或者这个环中是否包含所有元素
#include<iostream>
#include<map>
using namespace std;
map<char,char>mp,mmp;
int main(){
int T,n;
char ch;
cin>>T;
while(T--){
mp.clear();
mmp.clear();
cin>>n;
for(int i=1;i<=n;i++){
cin>>ch;
if(mp[ch]){
cout<<mp[ch];
}else{
for(char j='a';j<='z';j++){
if(mmp[j]||ch==j){
continue;
}
int cnt=0;
char t=j;
while(t&&mp[t]!=ch){
cnt++;
t=mp[t];
}
if(t&&cnt!=24){
continue;
}
mp[ch]=j;
mmp[j]=ch;
cout<<j;
break;
}
}
}
cout<<'\n';
}
return 0;
}