这个比赛的题目考的比较多的都是大数运算,或者unsigned long long 的数据范围(1e18以内)。

首先是a题,签到,只不过是加了英文的描述,大意就是多组数据输入,然后将每组的字符串大写转小写,小写转大写,其他的不管。

#include <cstdio>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <cstring>
using namespace std;
 
int main()
{
    char s[10000];
    while(~scanf("%s",&s)){
    int len=strlen(s);
    for(int i=0;i<len;i++){
        if(s[i]<='z'&&s[i]>='a') s[i]-=32;
        else if(s[i]<='Z'&&s[i]>='A') s[i]+=32;
    }
    cout<<s<<endl;
    }
    return 0;
}

然后是b题,一道简单的博弈题,一开始被题意蒙了一下,其实两堆没什么用,就合并成一堆,然后推了一下,就是分下奇偶数,奇数先手必赢,偶数后手必输。

#include <cstdio>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <cstring>
using namespace std;
 
int main()
{
    int a,b;
    while(~scanf("%d %d",&a,&b)){
        int sum=a+b;
        if(sum%2==0) cout<<"lose"<<endl;
        else cout<<"win"<<endl;
    }
    return 0;
}
 

c题,题目描述相对简单,就是找n个节点的无长度为3的环的简单无向图的最多边

别人很多都是暴力搜做的,其实可以找规律

即发现没有长度为3的环的图就是二分图,而完全二分图就是边数最多的。

引理:n个顶点的图G=(V,E),假设其顶点的最大度数为m,则边数最多为m*(n-m)

然后发现,当m=floor(n/2)时,当n是偶数时,最多边数就是n/2*n/2,奇数时就是((n-1)/2)*((n+1)/2).

#include <cstdio>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <cstring>
using namespace std;
 
int main()
{
    int n,m;
    while(~scanf("%d",&n)){
        if(n%2==0) m=(n/2)*(n/2);
        else m=(n-1)/2* (n+1)/2;
        cout<<m<<endl;
    }
    return 0;
}

然后就写了i题

题意就是给你两个数(<10^18),然后求这两数的差值转换成时间的格式即hh :mm :ss的形式

就是用ull存然后取余,除就分别算出小时,分钟和秒就行了

#include <cstdio>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <cstring>
using namespace std;
 
int main()
{
    unsigned long long a,b,c;
    unsigned long long n,m;
    while(~scanf("%llu %llu",&n,&m)){
        unsigned long long sum=m-n;
        a=sum/3600;
        sum=sum%3600;
        b=sum/60;
        c=sum%60;
        printf("%02llu:%02llu:%02llu\n",a,b,c);
    }
    return 0;
}