题目链接
A、Remove Smallest
水题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f
const int N = 2e5 + 10;
const int maxn=4000;
const double PI= acos(-1.0);
int a[N];
int main()
{
int t,n;
cin >> t;
while (t--)
{
cin >> n;
for(int i=0; i<n; i++)
cin >> a[i];
sort(a,a+n);
int sum=0;
for(int i=1; i<n; i++)
{
if(a[i]>a[i-1]+1)
{
sum = 1;
break;
}
}
if(sum)
cout << "NO" <<endl;
else
cout << "YES" <<endl;
}
return 0;
}
B、Gifts Fixing
水题+1
注意一下最大的范围
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f
const int N = 2e5 + 10;
const int maxn=4000;
const double PI= acos(-1.0);
ll a[N],b[N];
int main()
{
int t,n;
cin >> t;
while (t--)
{
cin >> n;
ll mina = 1e9+10,minb = 1e9+10;
for(int i=0; i<n; i++){
cin >> a[i];
mina = min(a[i],mina);
}
for(int i=0; i<n; i++){
cin >> b[i];
minb = min(minb,b[i]);
}
ll sum = 0;
for(int i=0;i<n;i++)
{
sum += max(a[i]-mina,b[i]-minb);
}
cout << sum <<endl;
}
return 0;
}
C、Boats Competition
题意:给定n个人的重量,分配这些人两两一组,要求每艘船上的两个人的体重和都相等。问最多可以分配出几艘船。
思路:找了很多题解,全都是用暴力去解决……
因为体重的范围很小,枚举每组的体重和,看有几组能够组成。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f
const int N = 2e5 + 10;
const int maxn=4000;
const double PI= acos(-1.0);
ll a[N],b[N];
ll num[N];
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,x;
cin >> n;
memset(num,0,sizeof(num));
for(ll i=0;i<n;i++)
{
cin >> x;
num[x]++;
}
ll ans=0;
for(ll K=2;K<=100;K++)
{
ll temp=0;
for(ll i=1;i*2<=K;i++)
{
if(i*2!=K) temp+=min(num[i],num[K-i]);
else temp+=num[i]/2;
}
ans=max(ans,temp);
}
cout<<ans<<endl;
}
}
D、Binary String To Subsequences
题意:给你一个长度为d的01串,把他分成若干个子序列,使得每个子序列都满足0和1交替出现,问最少能分成多少个子序列,以及每个元素分别分给哪一个子序列。
思路:其实一直没看懂题意,找题解看明白了。
遍历,如果元素是1,看前面是否有0没有匹配,没有匹配则和原先那个0匹配,否则自己新成一个序列;0同理。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f
const int N = 2e5 + 10;
const int maxn=4000;
const double PI= acos(-1.0);
ll ans[N],b[N];
ll num[N];
int main(){
int t,n;
string s;
cin >> t;
while(t--){
cin >> n >> s;
vector<int>v[2];
int cnt=0;
for(int i=0;i<n;i++){
int x = s[i]-'0';
if(v[!x].empty()){
v[x].push_back(++cnt);
ans[i]=cnt;
}else{
v[x].push_back(v[!x].back());
ans[i]=v[!x].back();
v[!x].pop_back();
}
}
cout << cnt <<endl;;
for(int i=0;i<n;i++){
cout << ans[i] << ' ';
}
cout <<endl;
}
return 0;
}