第一次組織訓練在牛客上選擇了這場比賽(沒想到后面的題還挺難的),于是給剛開始訓練的隊員寫一下題解,
D - jyq跳格子
跳四格就相當于兩次跳兩格,直接判斷奇偶,
#include "bits/stdc++.h"
using namespace std;
int main()
{
int n;
cin>>n;
if(n&1)
cout<<n<<endl;
else
cout<<-1<<endl;
}
E - 歡迎來到CCNU
字串替換,可以用string類的方法,也可以用正則運算式,或者像下面這樣查字典,
#include "bits/stdc++.h"
using namespace std;
int main()
{
string s;
cin>>s;
map<string,string> m;
m["hard"]="DespairSlope";
m["sohungry"]="DiningHall";
m["amazing"]="NanhuBuilding";
m["sobeautiful"]="GuiziMountain";
m["tired"]="YyBuilding";
m["study"]="Library";
m["toofast"]="SchoolBus";
int p=0,cnt=0;
for(int i=0,len=s.length();i<len;++i)
{
if(s[i]=='#')
{
cout<<m[s.substr(p,cnt)]<<"#";
p=i+1;cnt=0;
}
else ++cnt;
}
cout<<m[s.substr(p,cnt)];
}
K - 夢中的鬼魂
入門思維題,“交換”操作可以一次消除兩組“不同”,但是要求其中一對是GH,另一對是HG,“變化”操作一次只能消除一組“不同”,但是沒有任何要求,求最少操作次數,容易知道“交換”操作是最劃算的,一直“交換”到無法再“交換”時,剩下的“不同”再使用“變化”操作即可,假設有n對GH,m對HG,那么交換的次數就是min(n,m),變化的次數是max(n,m)-min(n,m),兩者相加,最后的結果為max(n,m),
#include "bits/stdc++.h"
using namespace std;
int main()
{
string s,t;
cin>>s>>t;
int gh=0,hg=0;
for(int i=0,len=s.length();i<len;++i)
if(s[i]!=t[i])
{
if(s[i]=='G'&&t[i]=='H') ++gh;
else ++hg;
}
cout<<max(gh,hg)<<endl;
}
L - LCY的QQ
最簡單的結構體排序,唯一值得注意的是排序要用stable_sort,否則會WA(當時沒注意WA了三發,罰時爆炸了),
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e8+7;
struct p
{
int index,spe,top,num;
}peo[maxn];
int n;
bool cmp(p a, p b)
{
if(a.spe==b.spe)
{
if(a.top==b.top)
{
return a.num<b.num;
}
else return a.top>b.top;
}
else return a.spe>b.spe;
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
{
peo[i].index=i;
cin>>peo[i].spe>>peo[i].top>>peo[i].num;
}
stable_sort(peo+1,peo+n+1,cmp);
for(int i=1;i<=n;++i)
{
cout<<peo[i].index<<" ";
if(peo[i].num>99) cout<<"99+"<<endl;
else cout<<peo[i].num<<endl;
}
}
B - 花園
用二維陣列記錄狀態的前綴和,num[i][j]的意義是從第1朵花到第i朵花之中,第j種花有多少株,那么s到t之間第j種花的數目就是num[t][j]-num[s-1][j],這樣對于每組(s,t)的詢問,復雜度為(花的種類數<=50)*O(1)=O(1),其中利用map存盤第j種花對應的序號,
#include "bits/stdc++.h"
#define int long long
using namespace std;
const int maxn = 5e5+7;
int n,a,q,s,t,val[55],num[maxn][55],cnt;
map<int,int> m;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=cnt;++j) num[i][j]=num[i-1][j];
cin>>a;
if(m[a]==0) m[a]=++cnt,val[cnt]=a;
++num[i][m[a]];
}
cin>>q;
while(q--)
{
int ans=0;
cin>>s>>t;
if(s>t) swap(s,t);
for(int i=1;i<=cnt;++i) ans=max(ans,val[i]*(num[t][i]-num[s-1][i]));
cout<<ans<<endl;
}
}
F - 你猜我是簽到嗎?
我猜不是,
待補,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237980.html
標籤:其他
