3
5 1 1
8 10 10
1000000 1 1000000
5
8
499999500000
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
ll n,g,b,t;
string s;
int main(){
cin>>t;
while(t--){
cin>>n>>g>>b;
ll num=(n+1)/2,res=0;
res=(num-1)/g*(g+b)+(num%g?num%g:g);
cout<<max(res,n)<<endl;
}
return 0;
}
C
一行row 26个字母的键盘 输入密码必须在当前键相邻左边或者右边 给一个字符串s 能否实现这样的键盘?
s中相邻字符保证不一样
vector实现左插右插
map实现ll,char对应字母
set放已出现过的字母 分离未出现过的字母
5
ababa
codedoca
abcda
zxzytyz
abcdefghijklmnopqrstuvwxyza
YES
bacdefghijklmnopqrstuvwxyz
YES
edocabfghijklmnpqrstuvwxyz
NO
YES
xzytabcdefghijklmnopqrsuvw
NO
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
ll n,g,b,t;
string s;
map<ll,char> m;
void solve(){
ll p=0,f=0;
set<ll> q;
vector<ll> v;
q.insert(s[0]-'a');
v.push_back(s[0]-'a');
for(int i=1;i<s.size();i++){
if(!q.count(s[i]-'a') && p==0) //不存在 p在最左端
{
q.insert(s[i]-'a');
v.insert(v.begin(),s[i]-'a');//插入vector首部 insert
p=0;
}
else if(!q.count(s[i]-'a') && p==v.size()-1){ //不存在 p在最右端
q.insert(s[i]-'a');
v.push_back(s[i]-'a');
p++;
}
else if(q.count(s[i]-'a')){//不可能有相邻2位重复字母
if(s[i]-'a' == v[p-1]) //p的左边
p=p-1;
else if(s[i]-'a' == v[p+1]) //p的右边
p=p+1;
else //v[-1] v[v.size()] 不可能与s[i]-'a'一样
{
f=1;
break;
}
}
else //未出现过 无法加在左右两端
{
f=1;
break;
}
}
if(f)
cout<<"NO"<<endl;
else{
cout<<"YES"<<endl;
for(int i=0;i<v.size();i++){
cout<<m[v[i]];
}
for(int i=0;i<=25;i++){
if(!q.count(i))
cout<<m[i];
}
cout<<endl;
}
}
int main(){
for(int i=0;i<=25;i++){
m[i]='a'+i;
// cout<<m[i]<<" ";
}
// cout<<endl;
cin>>t;
while(t--){
cin>>s;
solve();
}
return 0;
}