Dashboard - Codeforces Round #824 (Div. 2) - Codeforces
1.
void slove(){
cin>>n;
if(n<=8){
cout<<0<<endl;
return;
}
int t1=1;
int t2=(n-4)/3;
int t3=n-4-t2;
int ans=min(t2-t1,t3-t2);
while(1){
if(min(t2+1-t1,(t3-1)-(t2+1))>ans) {
ans=min(t2+1-t1,(t3-1)-(t2+1));
t2++;
t3--;
}
else break;
}
cout<<ans<<endl;
}
2.
考虑每部分最多可以时多少,最小值的两倍-1,所以考虑每次都切出去这么多。但是如果直接a[i] / (a[1] * 2 - 1)会发现10,然后38需要两刀实际上只需要一刀。所以对那种是倍数的就-1即可。
void slove(){
cin>>n;
fel(i,1,n) cin>>a[i];
sort(a+1,a+1+n);
int ans=0;
if(a[1]==1){
int ans=0;
fel(i,2,n){
ans+=(a[i]-1);
}
cout<<ans<<endl;
}
else{
int ans=0;
fel(i,2,n){
ans+=a[i]/(a[1]*2-1)-(a[i]%(a[1]*2-1)==0);
}
cout<<ans<<endl;
}
}
3.
就是对前面的字符尽量选择大的,然后如何判断这个字符可不可以选呢?
就是我后面的字符没有他,或者后面有25给字母绕个圈于是他就可以接在我的头上。
const int N=500;
int n;
string s;
int q[N],h[N],vis[N],cnt,flag;
void dfs(int now,int pre){
if(now==-1) return;
cnt++;
if(now==pre) flag=1;
dfs(h[now],pre);
}
bool check(char pre,char ne){
if(pre!=ne&&vis[pre]==0){//pre此时还没做过前驱,所以只要搜他在ne的后面没即可。
//两种可能一种是这个字符还没用过,另外一种是是ne和pre之间隔24个字母首位相接
cnt=0,flag=0;
dfs(h[ne],pre);
if(flag==0||cnt==25){
return true;
}
}
return false;
}
void slove(){
cin >> n;
cin >> s;
s = " " + s;
fel(i,0,200) vis[i]=0,q[i]=-1,h[i]=-1;
string ans="";
fel(i,1,n){
if(q[s[i]]!=-1){
ans+=q[s[i]];
continue;
}
for(char j='a';j<='z';j++){
if(check(j,s[i])){
q[s[i]]=j;
h[j]=s[i];