2020.10.16个人赛

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){//越过该值后,c==1
for(i=0;i<n;i++)ans1+=a[i];
ans1-=n;
printf("%lld\n",ans1);
return 0;
}
sort(a,a+n);
c=1;
while(1){
if(quick_pow(c,n-1)>=a[n-1])break;
c++;
}
for(i=0;i<n;i++){
d=quick_pow(c,i);
if(d>=a[i])ans1+=d-a[i];
else ans1+=a[i]-d;
}
c--;//边界处理
for(i=0;i<n;i++){
d=quick_pow(c,i);
if(d>=a[i])ans2+=d-a[i];
else ans2+=a[i]-d;
}
printf("%lld\n",min(ans1,ans2));
return 0;
}

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;
}

 

posted @ 2020-10-25 15:38  yyscn  阅读(84)  评论(0)    收藏  举报