文章目錄
- A題 (拆分多集)
- B題(獲得多數票)
- C題(固定 OR 的遞增序列)
A題 (拆分多集)
?本題在賽時卡的時間比較久,把這題想復雜了,導致WA了兩次。后來看明白之后就是將n每次轉換成k-1個1,到最后分不出來k-1個1直接一次就能分完,即結果加一;
#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define fi first
#define se second
#define PII pair <int,int>
#define ALL(x) x.begin(),x.end()
#define lowbit(x) (x&(-x))
using namespace std;
const int N = 1e6+5;
int a[N],b[N];void solve () {int n,k;cin>>n>>k;if(n==1) {cout<<0<<'\n';return;}int pos=0;while (n>k) {n-=k-1;pos++;} cout<<pos+1<<'\n';
}signed main () {IOS;int T =1;cin>>T;while(T--) solve ();return 0;
}
B題(獲得多數票)
題意就是給出一段字符串,字符串里面只包含0,1。然后可以找到 [ l , r ] [l,r] [l,r]區間里面,將區間里面的字符串變成一個字符,這個字符是0或1,到底是哪個,圖片中有詳細描述。
思路:將字符串里面連續的0全部轉化成一個0,再比較0,1個數
#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define fi first
#define se second
#define PII pair <int,int>
#define ALL(x) x.begin(),x.end()
#define lowbit(x) (x&(-x))
using namespace std;
const int N = 1e6+5;
int a[N],b[N];void solve () {int n;cin>>n;string s;cin>>s;int cnt=0,ans=0;int j;for (int i=0;s[i]!='\0';) {if (s[i]=='0') {cnt++;j=i;while (s[j]=='0')j++;i=j;}else {i++;ans++;}} if (cnt>=ans)cout<<"NO"<<'\n';else cout<<"YES"<<'\n';
}signed main () {IOS;int T =1;cin>>T;while(T--) solve ();return 0;
}
C題(固定 OR 的遞增序列)
題意:給一個數字n,寫出一個序列,要求遞增,并且兩項之間或運算為n
思路:利用二進制的特點,將0,1填入,最后逆序輸出
#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define fi first
#define se second
#define PII pair <int,int>
#define ALL(x) x.begin(),x.end()
#define lowbit(x) (x&(-x))
using namespace std;
const int N = 1e6+5;
int a[N],b[N];void solve () {int n;cin>>n;if (n==1||n==2) {cout<<1<<'\n'<<1<<'\n';return ;}a[0]=n;int k=0;int t=n,pos=1;while (t) {if (t&1) {a[++k]=n-pos;}pos*=2;t/=2;}if (a[k]==0) {cout<<1<<'\n'<<n<<'\n';return;}cout<<k+1<<'\n';for (int i=k;i>=0;i--) {cout<<a[i]<<' ';}cout<<'\n';
}signed main () {IOS;int T =1;cin>>T;while(T--) solve ();return 0;
}