这个比赛的题目考的比较多的都是大数运算,或者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; }