Educational Codeforces Round 42 (Rated for Div. 2)_A-D题解

A. Equator
这个题看了立马就开始写,三四分钟就交上去了,预判正确,当时感觉还挺顺,哈哈......
结果后来被人hack了,哇第一题都不对的嘛.....
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef long long ll;
const int MAXN =  201000;
ll n,sum;
ll a[MAXN];

int main()
{
    sum = 0;
    scanf("%I64d",&n);
    for(int i = 0;i < n;i ++)
    {
        scanf("%I64d",&a[i]);
        sum += a[i];
    }
    ll x = sum /2;
    if( x * 2 != sum) x ++;
    sum  = 0 ;
    for(int i = 0;i < n;i++)
    {
        sum+=a[i];
        if(sum >= x)
        {
            printf("%d\n",i+1);
            return 0;
        }
    }

}
B. Students in Railway Carriage
第二题看了之后感觉很简单的,但是想了一会没有想到很好的解决办法,所以就只好模拟了,开始模拟之后想的是如果是一个的话就放多的那个,如果不是一个就混合放,混合放的话还要分为放满和放不满,哇,中间还写崩了一次,重写了一次,第一次提交,错在了第十组样例,然后再改后来想到这种数据: 10 10 0  ..........      这样的话我的模拟程序出1,不对啊,应该出5才对没然后就把程序改了,哈哈,预判正确,这时候已经过了一个小时了。。。结果后来测试的时候又错在了53组样例。还是没过,最后补题的时候,发现这不就是个简单的贪心嘛,程序也很简单
#include 
#include 
#include 

using namespace std;
const int maxn = 200100;
char s[maxn];
int a,b,n;

int main()
{
    scanf("%d%d%d",&n,&a,&b);
    scanf("%s",s);
    int ans = 0;
    if(a < b) swap(a,b);
    for(int i = 0;i < n;i++)
    {
        if(s[i] == '*')
        {
            if(a < b )swap(a,b);
        }
        else
        {
            if(a == 0 && b == 0) break;
            if(a > 0)
            {
                ans ++;
                a--;
                swap(a,b);
            }
            else
            {
                swap(a,b);
            }
        }
    }
    printf("%d\n",ans);
}

C. Make a Square
这个题一看就是状态压缩,马上写出程序,然后疯狂错了一个小时的第一个样例,因为我一直用的是Codeblocks,但是我在Codeblocks上测试是对的啊,然后就这样两个小时结束了,那时候还以为能对两个呢,觉得海星。补题的时候怎么试都不对,就我下载了个Dev,在那上面找到了错误,将sqrt其那面加了个状态转换转换为int,将pow转换成了循环或者位运算,一次就对了.......难受
#include
using namespace std;

int  a;
int b[20000];
int main()
{
    while(cin>>a)
    {
        int index = 0;
        while(a > 0)
        {
            int x = a % 10;
            a /= 10;
            b[index++] = x;
        }
        int ans = 1e9;
        for(int i = 0;i < (1<=1 && num!= 0&&(int)sqrt(num) * (int)sqrt(num) == num)
                ans = min(index-x,ans);
        }
        if(ans == 1e9)
            cout<<-1<

D. Merge Equals
这个题当时都没时间读题,今天在宿舍快熄灯的时候,看了看题,不就是个简单的优先队列嘛,真的曰(yue)了...
直接用优先队列模拟就行,wa了一次数据6,因为没有用long long ,第二次换成long long就对了
#include

using namespace std;

typedef long long ll;
const int maxn = 150100;
int n;
struct Node
{
    int index;
    ll num;
    bool flag;
    bool operator <(const Node &a)const
    {
        if(num == a.num)
            return index > a.index;
        return num  > a.num;
    }
}node[maxn];
priority_queue q;
bool xmp(Node a,Node b)
{
    return a.index < b.index;
}
int main()
{
    scanf("%d",&n);
    for(int i  =0 ;i < n;i++)
    {
        scanf("%I64d",&node[i].num);
        node[i].index = i;
        node[i].flag = 0;
        q.push(node[i]);
    }
    Node first = q.top();q.pop();
    while(!q.empty())
    {
        Node x = q.top();
//        cout<
先补到这里,后面三个题明天再补,总之还是做题做的太少了,没有做题的经验,这次是 一个题都没出,还是太菜了,以后还要更努力才行!!!


你可能感兴趣的:(Codeforces)