A. Eating Soup
链接:A. Eating Soup
这题不是很难,我直接模拟过的,但是后来看别人的特殊方法,代码都很短,于是就想记录一下(万一哪天有用呢)。
我的代码(模拟):
#include<iostream>
using namespace std;
int main(){
int T=1;
// cin>>T;
while(T--){//这个循环只是为了自己输入案例的时候不用运行好多次
int n,m;
cin>>n>>m;
if(m==0){
cout<<1<<endl;
continue;
}else if(n==m){
cout<<0<<endl;
continue;
}
int a[1005]={0};
int sum=0;
for(int i=1;i<=n;i++){
if(a[i]==0){//如果没标记过
sum++;
if(sum==2){
sum=0;
a[i]=1;//标记
m--;
}
if(m==0){
break;
}
}
if(i==n){//重新循环
i=0;
}
}
int ans=0;
for(int i=2;i<=n;i++){//从2开始
if(a[i]==0&&a[i-1]==1){
ans++;
}
}
if(a[1]==0&&a[n]==1){//单独判断1和n
ans++;
}
cout<<ans<<endl;
}
return 0;
}
别人的方法:
m 个断点最多可以将环分成 m 段,剩下 n−m 个点最多可以成为 n−m 段,他们中的min就是结果
此外m==0的时候答案是1
代码:
#include<iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
if(m==0){
cout<<1<<endl;
}else{
cout<<min(m,n-m)<<endl;
}
return 0;
}
还有一种(还没仔细揣摩):
代码:
#include<iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
if(n==m){
cout<<0<<endl;
return 0;
}else if(m==0){
cout<<1<<endl;
return 0;
}else{
int t=n/2;
if(t<m){
cout<<n-m<<endl;
}else{
cout<<m<<endl;
}
}
return 0;
}