遲到的補題。。。。
題意:
你可以用花費元,使得或者不同時加或者減,你也可以花費元使得同時加或者減,問你最少花費多少錢使得。
思路:
無論你是同時還是單一操作,你都要先使得,然後再考慮使用同時加減還是單一加減更優。
代碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
typedef long long int ll;
void solved(){
int t;cin>>t;
while(t--){
ll x,y,a,b;cin>>x>>y>>a>>b;
cout<<(max(x,y)-min(x,y)) * a + min(min(x,y) * b,min(x,y) * 2 * a)<<endl;
}
}
int main(){
solved();
return 0;
}
題目大意:
給你一個字符串,要你生產一個字符串,使得是的子串,並且的循環週期最短並且的長度。
思路:
容易發現如果本身只包含字符串的時候,循環週期爲且最短,這個時候直接輸出即可。當包含字符串的時候我們不可能生產出比周期更短的字符串,但是週期確實可以生產的,只需要保證的長度是的兩倍,那麼一定是的字串,並且把生成這樣的字符串即可,因爲週期爲最短。
代碼:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
typedef long long int ll;
void solved(){
int t;cin>>t;
while(t--){
string s;cin>>s;
int f1 = 0,f0 = 0;
for(int i = 0; i < s.size(); i++){
if(s[i] == '1')f1 = 1;
if(s[i] == '0')f0 = 1;
}
if(f1 && f0){
for(int i = 0; i < s.size(); i++){
cout<<"01";
}
cout<<endl;
}else{
cout<<s<<endl;
}
}
}
int main(){
solved();
return 0;
}
題目大意:
給你兩個十進制數字,和個詢問,每個詢問包含一個區間,問你這個區間滿足 %%b %%的數有多少個。
思路:
當的時候一定不滿足。
我們可以發現當的時候%%b %%,並且這一段都不滿足,進而可以推廣這些段不滿足,換言之,是滿足條件的。所以我們需要在找有多少個,可以找出個數,當然還要考慮邊界情況,把R可以少加的加上,把L可能少減的減掉就行了。
代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
void solved(){
int t;cin>>t;
while(t--){
ll a,b,q;cin>>a>>b>>q;
ll lcm = a / __gcd(a,b) * b;
while(q--){
ll l,r;cin>>l>>r;
if(r < max(a,b)){
cout<<"0"<<endl;
}else{
ll n = r / lcm - l / lcm;
ll ans = n * (lcm - max(a,b));
r %= lcm;
if(r >= max(a,b))ans += r - max(a,b) + 1;
l %= lcm;
if(l > max(a,b))ans -= l - max(a,b);
cout<<ans<<" ";
}
}
cout<<endl;
}
}
int main(){
solved();
return 0;
}
題目大意:
給你個數,要你分組,每組需要滿足的個數不超過,。。。的個數不超過。要你使得分組數最少,並且輸出分組方案。
思路:
爲了方便處理先把所有數升序,然後找滿足大於等於的數有多少個,向上取整然後去最大值,就是最小方案數了。你可以這樣理解,最大值並且大於其他所有數,其他所有分組數都滿足了,這個時候只需要滿足最大的這個數了,就會滿足所有情況。然後把每個數依次分組填入即可(即將最大峯值縮小)。
核心:向上取整
代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int maxn = 2e5 + 10;
int m[maxn],c[maxn];
vector<int>ve[maxn];
void solved(){
int n,k;cin>>n>>k;
for(int i = 1; i <= n; i++)cin>>m[i];
for(int i = 1; i <= k; i++)cin>>c[i];
sort(m + 1, m + 1 + n);
int ans = 0;
for(int i = 1; i <= n; i++){
ans = max(ans,((n - i + 1) - 1) / c[m[i]] + 1);
}
for(int i = 1; i <= n; i++){
ve[(i - 1) % ans].push_back(m[i]);
}
cout<<ans<<endl;
for(int i = 0; i < ans; i++){
cout<<ve[i].size()<<" ";
for(int j = 0; j < ve[i].size(); j++){
cout<<ve[i][j]<<" ";
}
cout<<endl;
}
}
int main(){
solved();
return 0;
}