rt 代码:
#include<bits/stdc++.h>
using namespace std;
inline bool cmp(int b,int l){return b<l;}
int main()
{
int n=0,m=0,sum=0,on_Table=0;
cin>>n>>m;
int a[n+1]={};
for(int i=0;i<=n-1;i++)
{
cin>>a[i];
sum+=a[i];
}
sort(a,a+n,cmp);
for(int i=0;i<=n-1;i++)
{
if(i!=0&&a[i-1]==a[i])
{
continue;
}//找到每一个数的开始
int on_the_table=0;//在桌子上牌的总和
int next_subscript=i;//牌堆顶的牌
int now_subscript=next_subscript;//拿一张
next_subscript=(next_subscript+1)%n;//牌堆更新
on_the_table+=a[now_subscript];//放
int start_subscript=i;//弃牌堆开始的下标
if(next_subscript==start_subscript)
goto repeated;//弃牌堆里的牌不能拿
while(a[next_subscript]==a[now_subscript]||a[next_subscript]==(a[now_subscript]+1)%m)
{//如果可以跟着放
now_subscript=next_subscript;//拿牌
next_subscript=(next_subscript+1)%n;//牌堆更新
on_the_table+=a[now_subscript];//放
if(next_subscript==start_subscript)
goto repeated;//弃牌堆里的牌不能拿
}
repeated:on_Table=max(on_Table,on_the_table);
}
cout<<sum-on_Table;
return 0;
}