16.7.16

对于无穷大的定义#define INF 0x1f1f1f1f

//今日代码
2016-07-16 personal training

A. Gravity Flip

(问改变重力方向之后的按列个数,其实只是简单的排序而已)

#include<iostream> 
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

int arr[1001]; 

int main()
{
    freopen("xx.in","r",stdin);
    freopen("xx.out","w",stdout);

    int n;
    cin >> n;

    for(int i = 0; i < n; i++)
        cin >> arr[i];

    sort(arr,arr+n);

    cout << arr[0];
    for(int i = 1; i <n ; i++)
        cout <<" "<< arr[i];
    cout << endl;

    return 0;   
}

B. Domino Effect

(问按给定方向倒的多米诺骨牌最后剩下几个没倒)
(先判最左最右的多米诺骨牌剩下个数,然后判中间每两个方向之间的剩下个数,L < R则中间都剩下,否则分奇偶讨论,奇数则剩下1个,偶数没有剩下的)

#include<iostream> 
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

int arr[500050];

int main()
{
    freopen("xx.in","r",stdin);
    freopen("xx.out","w",stdout);

    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
        scanf("%d",&arr[i]);

    int step = 0;
    int L,R;
    int l,r;    
    for(int i = 0; i < n-1; i++)
    {
        L = i,R = i;
        while(arr[R]!=arr[R+1] && R < n-1) R++;
        l = L+1,r = R-1;
        int s = 0;
        while(l<=r)
        {
            s++;
            arr[l] = arr[L];
            arr[r] = arr[R];
            l++;
            r--;
        }
        if(step<s) step = s;
    } 

    cout << step<< endl;
    cout << arr[0];
    for(int i = 1; i < n; i++)
        printf(" %d",arr[i]);
    cout << endl;

    return 0;   
}

C. Unusual Product

(问一个只有0和1的n×n矩阵按题目意思运算之后的结果)

(显然数据非常大直接模拟会超时,规律得到只有矩阵迹上的数字在运算后得以保存,其余位置的数字都重复运算了两次,0×1+1×0 = 0, 1×1+1×1 = 0,总之最后都是0,所以即使op=1或2时改变的是整行整列,最终影响只要考虑对角线上的数字即可,且对角线数字一经改变,ans的值一定改变,不用再次计算迹的和,直接取反就好,否则超时。改变0、1时用异或1取反。)

#include<iostream> 
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

int arr[1010][1010];
int n;

int main()
{
    freopen("xx.in","r",stdin);
    freopen("xx.out","w",stdout);

    cin >> n;
    for(int i = 0; i < n; i++)
        for(int j = 0; j <n; j++)
            scanf("%d",&arr[i][j]);

    int ans = 0;
    for(int i = 0; i < n; i++)
        ans ^= arr[i][i];

    int t;
    cin >> t;
    int op;
    while(t--)
    {
        scanf("%d",&op);
        int num;
        if(op == 1 || op == 2) 
        {
            scanf("%d",&num);
            ans^=1; 
        }
        else if(op == 3)
        {
            printf("%d",ans);
        }
    }

    return 0;   
}

D. Toy Sum

(求满足这里写图片描述 的一组y值)

(利用对称性,1与1000000对应,2与999999对应,依次类推。只要判一下X集合中数字的对应数字就好。当对应数字没被X选中时,Y选取该对应数字;否则Y则选取另一对没被选过的数字。这样选取后最终结果和X集合中数字个数一样。)
(注意下数据量很大,cin cout会超时)

#include<iostream> 
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

int num[1000010];
bool X[1000010];
int Y[1000010];

int main()
{
    freopen("xx.in","r",stdin);
    freopen("xx.out","w",stdout);

    int n;
    cin >> n;
    for(int i = 0; i <n; i++)
    {
        scanf("%d",&num[i]);
        X[num[i]] = true;
    }


        int i = 0;
        int len = 0;
        int choose = 1;
        while(i < n)
        {
            int inde = 1000000-num[i]+1;
            if(X[num[i]] == true && X[inde] == false) 
                Y[len++] = inde;
            if(X[num[i]] == true && X[inde] == true) 
            {
                X[inde] = false;
                while(choose <= n)
                {
                    if(!X[choose] && !X[1000000-choose+1])
                    {
                        Y[len++] = choose;
                        Y[len++] = 1000000-choose+1;
                        choose++;
                        break;
                    }
                    choose++;
                }
            }
            i++;
        }


    cout << len << endl<< Y[0];
    for(int i = 1; i < len; i++)
        printf(" %d",Y[i]);
    printf("\n");

    return 0;   
}

F. George and Sleep

(简单的计算时差)

#include<iostream> 
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;


int main()
{
    freopen("xx.in","r",stdin);
    freopen("xx.out","w",stdout);

    int sh,sm;
    int th,tm;
    string s;
    cin >> s;
    sscanf(s.c_str(),"%d:%d",&sh,&sm);
    cin >> s;
    sscanf(s.c_str(),"%d:%d",&th,&tm);


    int hh = sh-th;
    int mm = sm-tm;
    if(mm < 0) 
    {
        mm+=60;
        hh--;
    }
    if(hh < 0) hh+=24;

    printf("%02d:%02d\n",hh,mm);

    return 0;   
}

G. George and Round

(判断第二行中比第三行大的有几个)

#include<iostream> 
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

int arr[3030];
int arr2[3030];

int main()
{
    freopen("xx.in","r",stdin);
    freopen("xx.out","w",stdout);

    int n,m;
    cin >> n >> m;
    for(int i = 0; i < n; i++)
        cin >> arr[i];
    for(int i = 0; i < m; i++)
        cin >> arr2[i];

    sort(arr,arr+n);
    sort(arr2,arr2+m);

    int i,j;
    for(i = 0, j = 0; i < n && j < m; j++)
    {
        if(arr2[j] >= arr[i]) i++;
    }

    cout << n-i << endl;

    return 0;   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值