E. Boxers
题意:有N个运动员,每个运动员都可以选择一次改变自己体重的机会(将体重加一、减一、不变),体重不可以为0,问最多可以 有多少种不同的体重
题解:从大到小排序,依次从体重加一、不变、减一判断,选择体重没有被标记过的一种,统计种类即可
为啥从加一开始?因为最大的数加1一定是可以的,依次往下推一样
#include<iostream> #include<string.h> #include<string> #include<algorithm> #include<math.h> #include<string> #include<string.h> #include<vector> #include<utility> #include<map> #include<queue> #include<set> #define mx 0x3f3f3f3f #define ll long long using namespace std; int n; int vis[4000005]; int a[4000005]; ll gcd(ll x, ll y)//最大公约数 { return y == 0 ? x : gcd(y, x % y); } bool cmp(int x,int y) { return x>y; } int main() { int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n,cmp); int cnt=0; for(int i=0;i<n;i++) { if(vis[ a[i]+1 ]==0) { vis[a[i]+1]=1; cnt++; } else if(vis[ a[i] ]==0) { vis[ a[i] ]=1; cnt++; } else if( vis[ a[i]-1 ]==0&&a[i]-1>0) { vis[ a[i]-1 ]=1; cnt++; } } cout<<cnt<<endl; }