TESyyds,本来以为又要3:1,结果创造历史!!!非常激动啊好久好久没看过让二追三了。
无缝衔接回旋踢,qa插眼we。送给雷达哥
A - Fourtune Cookies
签到题
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
int main()
{IO;int T=1;//cin>>T;for(int ca=1;ca<=T;ca++){int a[4];for(int i=0;i<4;i++) cin>>a[i];sort(a,a+4);if(a[0]+a[1]+a[2]==a[3]||a[0]+a[2]==a[1]+a[3]||a[0]+a[3]==a[1]+a[2])cout<<"Yes\n";elsecout<<"No\n";}return 0;
}
B - MAX-=min
做的时候感觉和求gcd的过程有点像,于是直接猜结论求序列gcd直接就过了
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=100010;
int a[N];
int n;
int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}
int main()
{IO;int T=1;//cin>>T;for(int ca=1;ca<=T;ca++){// multiset<int> s;// cin>>n;// for(int i=1;i<=n;i++) // {// int a;// cin>>a;// s.insert(a);// }// while(1)// {// auto b=s.begin(),e=s.end();// e--;// int x=*b,y=*e;// if(x==y) break;// s.erase(e);// s.insert(y-x);// }// cout<<*s.begin()<<'\n';cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int d=a[1];for(int i=2;i<=n;i++) d=gcd(d,a[i]);cout<<d<<'\n';}return 0;
}
C - Camels and Bridge
大佬题解
刚开始看了半天题,不知道从何入手,然后发现N非常小于是考虑枚举排列。但是之后就不会做了。
看了题解之后发现自己陷入了一个误区——桥的排序,本题每部分桥都是一个限制条件,而并不用关系桥的顺序。
排序定后现在要求1~n的最小距离,考虑设计dp
状态表示:fif_ifi表示1→i1\to i1→i的最小距离
状态转移:fi=max(fi,fj+len)f_i=max(f_i,f_j+len)fi=max(fi,fj+len),对于当前考虑的骆驼和之前的骆驼满足所有桥的条件,因而要考虑之前的所有骆驼取距离上限。
len可以预处理前缀然后二分体重快速求得详细看代码
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<random>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
#define v first
#define l second
using namespace std;
mt19937 rnd(233);
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=100010;
int w[12];
pii bdg[N];
int n,m;
int a[12];
ll f[12],s[12];
int len[N],b[N];
int main()
{IO;int T=1;//cin>>T;for(int ca=1;ca<=T;ca++){cin>>n>>m;int mx=0;for(int i=1;i<=n;i++) {cin>>w[i];mx=max(mx,w[i]);}for(int i=1;i<=m;i++) cin>>bdg[i].l>>bdg[i].v;sort(bdg+1,bdg+1+m);if(mx>bdg[1].v) {cout<<-1<<'\n';continue;}for(int i=1;i<=n;i++) a[i]=i;for(int i=1;i<=m;i++) len[i]=max(len[i-1],bdg[i].l);for(int i=1;i<=m;i++) b[i]=bdg[i].v;ll res=1e15;do{memset(f,0,sizeof f);for(int i=1;i<=n;i++) s[i]=s[i-1]+w[a[i]];for(int i=2;i<=n;i++)for(int j=1;j<i;j++){int tmp=s[i]-s[j-1];int p=lower_bound(b+1,b+1+m,tmp)-b-1;f[i]=max(f[i],f[j]+len[p]);}res=min(res,f[n]);}while(next_permutation(a+1,a+1+n));cout<<res<<'\n';}return 0;
}
总结:由于自己显然桥的顺序这个误区,一直不知道从何入手,没能够充分挖掘题目的条件,进一步简化已知条件。
D - Let’s Play Nim
大佬题解,直接copy大佬的题解,写的非常非常非常清晰,一下子就明白了,难道这就是考智商的题吗
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<random>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
mt19937 rnd(233);
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=100010;
int n;
map<int,int> mp;
int main()
{IO;int T=1;cin>>T;for(int ca=1;ca<=T;ca++){cin>>n;mp.clear();for(int i=1;i<=n;i++){int a;cin>>a;mp[a]++;}if(n&1)cout<<"Second\n";else{bool ok=0;for(auto t:mp)if(t.second&1) ok=1;if(ok) cout<<"First\n";else cout<<"Second\n";}}return 0;
}
总结:大佬题解的思路非常清晰,首先由于n的奇偶性会影响最终NIM游戏的先手顺序于是就分奇偶,然后考虑先手如何能让自己在最终的NIM的游戏中获得胜利,一步步趋近答案值得学习。
要加油哦~