目录
显示
一句话评价这次比赛:时间真的好晚啊,题也BT的要死。
在Announcement的最后写道,Oh, and if there will be no bad things, round will be rated. I hope.
结果比赛最后半个小时果真出锅了…
题目链接
http://codeforces.com/contest/987
A. Infinity Gauntlet
大意
给出宝石的颜色,求出灭霸的无尽手套究竟少了哪几种宝石。
题解
打这道题真累…
#include <cstdio> #include <string> #include <cstring> #include <iostream> using namespace std; string s; int a[15]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>s; if(s=="purple")a[1]++; if(s=="green")a[2]++; if(s=="blue")a[3]++; if(s=="orange")a[4]++; if(s=="red")a[5]++; if(s=="yellow")a[6]++; } cout<<6-n<<endl; for(int i=1;i<=6-n;i++) { if(!a[1])cout<<"Power",a[1]++; else if(!a[2])cout<<"Time",a[2]++; else if(!a[3])cout<<"Space",a[3]++; else if(!a[4])cout<<"Soul",a[4]++; else if(!a[5])cout<<"Reality",a[5]++; else if(!a[6])cout<<"Mind",a[6]++; puts(""); } return 0; }
B. High School: Become Human
大意
给出 \(x\) 和 \(y\),判断 \(x^y\) 大还是 \(y^x\) 大。
题解
一道纯正的数学题,解法如下:
先在两边取对数,就变成比较 \(\ln (x^y)\) 和 \(\ln (y^x)\) 的大小,
也就是比较 \(y * \ln x\) 和 \(x * \ln y\) 的大小了。
两边同时除以 \(xy\),\( y * \ln x= \ln x / x\),\(x * \ln y= \ln y / y\)。
这就是结论了。
PS:\(f(x)= \ln x / x\) 的图像事实上是长这样的。

事实上,当 \(x<e\) 时,函数是单调递增的,\(x=e\) 时函数有最大值,\(x>e\) 时函数单调递减。
#include <stdio.h> #include <math.h> #define e 2.71828182845 int x,y; int main() { scanf("%d%d",&x,&y); long double ans1=log(x)/x,ans2=log(y)/y; if(ans1==ans2)puts("="); else if(ans1>ans2)puts(">"); else puts("<"); return 0; }
C. Three displays
大意
有一个序列,序列中的每个数字都有一个费用,现在要找一个长度为 \(3\) 的严格上升子序列,使得这三个数字的费用和最小。
题解
其实跟LIS并没有什么太大关系…
可以每次枚举一个点,向两边扩散,寻找左边较小的数字中的最低费用,右边较大数字中的最低费用,就可以解决这道题了。
#include <cstdio> #include <cstring> #include <string> #include <algorithm> #define maxn 5005 using namespace std; int n,f[5005],a[5005],ans,c[5005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&c[i]); int ansc=1000000000; for(int i=2;i<=n-1;i++) { int lmin=1000000000,rmin=1000000000; for(int j=i-1;j>=1;j--) if(a[j]<a[i])lmin=min(lmin,c[j]); for(int j=i+1;j<=n;j++) if(a[j]>a[i])rmin=min(rmin,c[j]); ansc=min(ansc,c[i]+lmin+rmin); } if(ansc!=1000000000)printf("%d",ansc); else printf("-1"); return 0; }