日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AtCoder Regular Contest 105 部分 NIM游戏

發布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AtCoder Regular Contest 105 部分 NIM游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 i1i的最小距離
狀態轉移: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的游戲中獲得勝利,一步步趨近答案值得學習。

要加油哦~

總結

以上是生活随笔為你收集整理的AtCoder Regular Contest 105 部分 NIM游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。