A. Minimum Difficulty
暴力去掉每个数,计算一下找最小值就行了。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <memory.h>
#include <vector>
#include <algorithm>
using namespace std;
int a[110];
int b[110];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=99999;
for(int i=2;i<n;i++){
int k=0;
for(int j=1;j<=n;j++){
if(j==i)continue;
b[k++]=a[j];
}
int MAX=0;
for(int j=0;j<n-1;j++){
MAX=max(MAX,b[j+1]-b[j]);
}
ans=min(ans,MAX);
}
cout<<ans<<endl;
return 0;
}
B. Secret Combination
枚举每个起点,把它置为0,其他的数变成对应的数,找最小值。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <memory.h>
#include <vector>
#include <algorithm>
using namespace std;
int a[2010];
char str[1010];
int ans[2010];
int tmp[2010];
int main(){
int n;
cin>>n;
scanf("%s",str);
for(int i=0;i<n;i++){
a[i]=str[i]-'0';
}
for(int i=n;i<2*n;i++){
a[i]=a[i-n];
}
for(int i=0;i<n;i++)ans[i]=9;
for(int i=0;i<n;i++){
int d=10-a[i];
for(int j=0;j<n;j++){
tmp[j]=(a[i+j]+d)%10;
}
for(int j=0;j<n;j++){
if(tmp[j]<ans[j]){
memcpy(ans,tmp,sizeof(tmp));
break;
}else if(tmp[j]>ans[j])break;
}
}
for(int i=0;i<n;i++){
cout<<ans[i];
}
return 0;
}
C. Removing Columns
开数组记录哪两个相邻的行已经区分出字典序,从左往右扫描列:如果上大于下,就需要把这一列去掉;如果上下相等无视;如果下大于上,记录它们已经区分出顺序。注意已经区分出来的相邻行不用比较了。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <memory.h>
#include <vector>
#include <algorithm>
using namespace std;
char strs[1010][1010];
bool ok[1010];
int main(){
int n,m;
cin>>n>>m;
memset(ok,0,sizeof(ok));
for(int i=0;i<n;i++){
scanf("%s",strs[i]);
}
int ans=0;
for(int k=0;k<m;k++){
bool remove=0;
for(int i=0;i<n-1;i++){
if(ok[i])continue;
if(strs[i][k]>strs[i+1][k]){
remove=1;
ans++;
break;
}
}
if(!remove){
for(int i=0;i<n-1;i++){
if(strs[i][k]<strs[i+1][k]){
ok[i]=1;
}
}
}
bool finish=1;
for(int i=0;i<n-1;i++){
if(!ok[i])finish=0;
}
if(finish){
break;
}
}
cout<<ans<<endl;
return 0;
}