簽到題:AC代碼如下 :
// Problem: H - What is all you need?
// Contest: Virtual Judge - sdccpc20250526
// URL: https://vjudge.net/contest/718568#problem/H
// Memory Limit: 1024 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//const int mod = 998244353;void solve()
{string s; cin>>s;string t = s.substr(s.size()-12,12);if(t == "isallyouneed"){cout<<"Yes"<<endl;string ans = s.substr(0,s.size()-12);cout<<ans<<endl;}else{cout<<"No"<<endl;}
}signed main()
{IOSint T=1;
// cin>>T;while(T--) solve(); return 0;
}
// Problem: K - UNO!
// Contest: Virtual Judge - sdccpc20250526
// URL: https://vjudge.net/contest/718568#problem/K
// Memory Limit: 1024 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<int,int>
#define fi first
#define se second
const int N = 1e6+10;
int a[N];
int res[N];void solve()
{bool f=1;deque<pii> q;int n,m; cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];q.push_back({a[i],i});}string s; cin>>s;for(int i=0;i<s.size();i++){if(f)//當前為正向(順時針){if(s[i]=='C')//沒有特殊操作 當前玩家出牌之后排到后面即可{if(q.front().fi==1) q.pop_front();//如果當前玩家只有一張牌了 直接出隊即可else//否則就排到后面 并且牌數-1{int x = q.front().fi-1;int y = q.front().se;q.pop_front();q.push_back({x,y});}}else if(s[i]=='S')//禁止效果 牌{if(q.front().fi==1) q.pop_front();//同上else{int x = q.front().fi-1;//同上int y = q.front().se;q.pop_front();q.push_back({x,y});}int x = q.front().fi;//禁止的效果 -> 當前玩家出牌后下一個玩家直接跳過 -> 直接往后排int y = q.front().se;q.pop_front();q.push_back({x,y});}else if(s[i]=='R')//順序反轉效果 牌{f=0;//順序改變if(q.front().fi==1) q.pop_front();//同上else{q.front().fi--;//不用往后排了,因為順序已經反轉了 下一次就要從逆時針開始轉了 只需要將牌數-1即可}//他在隊首的話就相當于是在逆時針方向時的隊尾}else{if(q.front().fi==1) q.pop_front();//同上else{int x = q.front().fi-1;int y = q.front().se;q.pop_front();q.push_back({x,y});}int x = q.front().fi+2;//加兩張牌效果int y = q.front().se;q.pop_front();q.push_back({x,y});//排到隊尾}}else//逆時針方向{ //之后代碼根上面的順時針方向基本一樣 只需要把隊首和隊尾進行調換即可 -> back->front :front->backif(s[i]=='C'){if(q.back().fi==1) q.pop_back();else{int x = q.back().fi-1;int y = q.back().se;q.pop_back();q.push_front({x,y});}}else if(s[i]=='S'){if(q.back().fi==1) q.pop_back();else{int x = q.back().fi-1;int y = q.back().se;q.pop_back();q.push_front({x,y});}int x = q.back().fi;int y = q.back().se;q.pop_back();q.push_front({x,y});}else if(s[i]=='R'){f=1;//改為順時針方向if(q.back().fi==1) q.pop_back();else{q.back().fi--;}}else{if(q.back().fi==1) q.pop_back();else{int x = q.back().fi-1;int y = q.back().se;q.pop_back();q.push_front({x,y});}int x = q.back().fi+2;int y = q.back().se;q.pop_back();q.push_front({x,y});}}}while(q.size())//最后將所有的人的牌數依次存放到res數組中即可{res[q.front().se]=q.front().fi;//一一對應(second代表下標->第幾個人 first代表當前所剩余的牌數)不在隊列中的就說明是這個人在之前就已經出完牌了 在res數組中就是0 直接輸出即可q.pop_front();}for(int i=1;i<=n;i++){cout<<res[i]<<endl;}return ;
}signed main()
{IOSint T=1;
// cin>>T;while(T--) solve(); return 0;
}
?
// Problem: M - 第九屆河北省大學生程序設計競賽
// Contest: Virtual Judge - sdccpc20250526
// URL: https://vjudge.net/contest/718568#problem/M
// Memory Limit: 1024 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N = 1e3;
string s[N];
int ra,rb,rc;
int pa,pb,pc;void solve()
{int n,m;cin>>n>>m;for(int i=1;i<=m;i++){cin>>s[i];}cin>>ra>>rb>>rc;cin>>pa>>pb>>pc;for(int i=1;i<=(1<<n)-1;i++)//在二進制中,2^n的二進制表示正好是n + 1位數 { //因為2^n在二進制中是1后面跟n個0,所以當2^n用二進制表示時,其位數為n + 1。bitset<20> bt(i);//將i轉成二進制 if(bt.count()>=10&&bt.count()<=13)//適當剪枝 {vector<int> ans;ans.push_back(1e18);//維護下標 使得下標從1開始 for(int j=1;j<=m;j++){bitset<20> c(s[j]);//將01串復制到 bitset中 c&=bt;//且運算操作 能夠找出兩個二進制數中的共同的1的個數ans.push_back(c.count());}sort(ans.begin(),ans.end(),greater<int>());if(ans[ra]==pa&&ans[rb]==pb&&ans[rc]==pc)//滿足題目要求 當前位次的過題數符合題意{cout<<bt.count()<<endl;//輸出一樣的個數for(int j=n-1;j>=0;j--){if(bt[j])cout<<n-j<<' ';}return ;}}}cout<<-1<<endl;return ;
}signed main()
{IOSint T=1;
// cin>>T;while(T--) solve(); return 0;
}
?
// Problem: J - Generate 01 String
// Contest: Virtual Judge - sdccpc20250526
// URL: https://vjudge.net/contest/718568#problem/J
// Memory Limit: 1024 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<int,int>
#define fi first
#define se secondvoid solve()
{vector<pii> a;string s; cin>>s;int num0=0,num1=0;for(int i=0;i<s.size();i++){if(s[i]=='0') num0++;if(s[i]=='1') num1++;}if(num0!=num1){cout<<"-1"<<endl;return ;}int x=0,y=0,index=1; //x中存還能補貼幾個0(目前有多少個因為操作2而多余的0)//y中存還能補貼幾個1(目前有多少個因為操作1而多余的1)for(int i=0;i<s.size();i++){if(s[i]=='0'){if(x==0) //如果沒有能補貼的0就只能通過操作1來構造出0 使用操作1之后就會多余出來一個1供以后出現的1使用{a.push_back({index,1});//將這時候的操作記錄下來y++;//由于使用了操作1 -> 所以會多出來一個1(即y++即可)}else{x--;//否則的話就是用操作2剩余的0來和這個位置所需的0來構造成一組 01/10串index++;//這一組構造完成后就不用管了,因為現在只需要考慮一定能構成要求串的情況}//其他的01/10串組可以在之后進行配對 讓index++就行了}else{if(y==0){a.push_back({index,2});x++;} else{y--;index++;}}}cout<<a.size()<<endl;for(auto i : a){cout<<i.fi<<' '<<i.se<<endl;}
}
/*00S1S10S1S 001101每次的操作(不管是操作1還是操作2),本質上都是S的個數++ 對數字而言 無非就是在01/10串之后添加一個10/01串所以可以把一個01/10串看作為一組 每次去構造每個組就行了 構造完成一組之后就讓index++ 去構造下一組
*/
signed main()
{IOSint T=1;
// cin>>T;while(T--) solve(); return 0;
}
?其實正解是二分~
附: