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;
}
这篇博客详细介绍了参与Codeforces Round #283 (Div. 2)比赛时,解决题目A、B、C的思路。对于A题,通过暴力搜索找到最小难度值。在B题中,通过枚举起点并调整数值以求解。C题的解决方案涉及扫描列,比较相邻行的字典序来确定处理方式。
1348

被折叠的 条评论
为什么被折叠?



