【#248_DIV2】-A B C

来源:互联网 发布:数据分析师能力 编辑:程序博客网 时间:2024/05/22 10:35

题目链接:http://codeforces.com/contest/433

解题报告:

A - Kitahara Haruki's Gift

水题,能选200先选200,不行再选100,正好能到一半就赢了。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int arr[120];int main(){    int n,i,sum=0,no1=0,no2=0;    cin>>n;    for(i=0;i<n;i++)    {        cin>>arr[i];        sum += arr[i];        if(arr[i] == 100) no1++;        else no2++;    }    int aim=sum/2;    bool ans=false;    int temp=0;    sort(arr,arr+n);    while(1)    {        if(temp == aim) {ans=true;break;}        if(temp < aim && temp+200 <= aim && no2)        {            temp += 200; no2--;        }        else if(temp < aim && temp+100 <= aim && no1)        {            temp += 100; no1--;        }        else break;    }    if(ans)        cout<<"YES"<<endl;    else        cout<<"NO"<<endl;    return 0;}


B - Kuriyama Mirai's Stones

水题,,比第一题还水,区间和预处理不解释

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>typedef long long ll;using namespace std;const int maxn = 1e5+50;ll arr[maxn],sum[maxn],res[maxn];int main(){    //freopen("input.txt","r",stdin);    memset(arr,0,sizeof(arr));    memset(sum,0,sizeof(sum));    memset(res,0,sizeof(res));    int n,i;    cin>>n;    for(i=1;i<=n;i++)        cin>>arr[i];    for(i=1;i<=n;i++)        sum[i]=sum[i-1]+arr[i];    sort(arr+1,arr+n+1);    for(i=1;i<=n;i++)        res[i]=res[i-1]+arr[i];    int noq,t,l,r;    cin>>noq;    while(noq--)    {        cin>>t>>l>>r;        if(t==1)            cout<<(sum[r] - sum[l-1])<<endl;        else if(t==2)            cout<<(res[r] - res[l-1])<<endl;    }    return 0;}


C - Ryouko's Memory Note

这题没做出来,看了CLJ的代码。才一下子想起来之前看过的一句话,这题的关键就一句话:

数轴上到各点距离之和最小的点是它们的中位数点!

然后枚举那正确的复杂度应该是 o( n*near[ i ] ) 那么大(写法不标准别在意),别脑残什么的写复杂了,然后即可AC

对了,不得不说,CLJ用 vector 之类的东西确实比我这种渣渣熟练多了,我很少用的

///数轴上到各个点距离之和最小的点是它们的中位数点!!#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <vector>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 1e5+50;ll arr[maxn];vector<int> near[maxn];int main(){    freopen("input.txt","r",stdin);    int n,m,i,j;    cin>>n>>m;    ll ans=0;    for(i=0;i<m;i++)    {        cin>>arr[i];        if(i>=1 && arr[i-1]!=arr[i])        {            near[arr[i]].push_back(arr[i-1]);            near[arr[i-1]].push_back(arr[i]);            ans += abs(arr[i-1]-arr[i]);        }    }    ll sum=ans;    for(i=1;i<=n;i++)    {        if(near[i].empty()) continue;        vector<int> temp = near[i];        sort(temp.begin(),temp.end());        int mid = temp[temp.size() / 2];        ll tans=0,preans=0;        for(j=0;j<temp.size();j++)        {            preans += abs(temp[j] - i);            tans += abs(temp[j] - mid);        }        ans = min(ans,sum-(preans-tans));    }    cout<<ans<<endl;    return 0;}


0 0
原创粉丝点击