D题:
判断多少个人可以和到喜欢的饮料,但饮料只能按对提供,可以先将偶数个的饮料分完,再将奇数个-1分完,最后剩余都是单数在统一分配。
#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
ll a[1005];
ll b[1005];
int main(){
ll n,k;
cin>>n;
cin>>k;
ll i;
for(i=0;i<n;i++){
cin>>b[i];
}
for(i=0;i<1000;i++){
a[i]=0;
}
for(i=0;i<n;i++){
a[b[i]]++;
}
ll sum=0,num=0;
for(i=0;i<1000;i++){
if(a[i]%2==0){
sum+=a[i];
}else if(a[i]%2!=0&&a[i]!=0){
sum+=a[i]-1;
num++;
}
}
if(num==0){
cout<<n<<endl;
}else{
if(n%2==0){
sum+=num/2;
}else{
sum+=(num+1)/2;
}
cout<<sum<<endl;
}
}
e题:
题意好理解,没时间了,还要注意数据类型。
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
using namespace std;
const ll nl=1e5+5;
string a[nl];
ll c[nl];
string b[nl];
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main(){
speed_up;
ll n;
ll k;
cin>>n;
cin>>k;
ll x,y;
x=(2*n+3)*(2*n+3)-(n*n+n-2*k)*4;
y=(2*n+3-sqrt(x))/2;
cout<<y<<endl;
}
b题:
此题不会,搜了下代码。给出n个元素组成的数组a,可以将其排序后进行处理,可将处理的元素加1或减1,这样算一次计数,最后处理成c^0,c^1,c^2,......,c^(n-1)的数组,要求计数数量最小。
#include <stdio.h>
#include <algorithm>
#define LL long long
#define maxn 100010
LL a[maxn],c,b,d,ans1,ans2;
using namespace std;
LL quick_pow(LL a,LL b){
LL ret=1;
while(b){
if(b&1)ret=ret*a;
a=a*a;
b>>=1;
}
return ret;
}
int main(){
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%lld",&a[i]);
if(n>63){
f题:此题学习了dp又看了代码勉强敲了一遍,感觉比赛是做不出来。
给定一个 2×n 的矩阵,现从中选择若干数,且任意两个数不上下或左右相邻,求这些数的和最大是多少
#include<iostream>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
ll dp[2][100005],a[100005],b[100005];
ll n;
int main()
{
ll n;
cin>>n;
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
for(int i=0;i<n;i++)
scanf("%lld",&b[i]);
dp[0][0]=a[0];
dp[1][0]=b[0];
for(int i=1;i<n;i++)
{
dp[0][i]=max(dp[0][i-1],dp[1][i-1]+a[i]);
dp[1][i]=max(dp[1][i-1],dp[0][i-1]+b[i]);
}
ll ans=max(dp[0][n-1],dp[1][n-1]);
printf("%lld\n",ans );
return 0;
}