1.?零食爭議【算法賽】
簽到題:1-7奇數相加
#include <bits/stdc++.h>
using namespace std;
int main()
{// 請在此輸入您的代碼cout<<1+3+5+7;return 0;
}
2.?數字炸彈【算法賽】
把n個人看為前n-1和后n-1 , 方便找到是第幾段的第幾個數
#include <bits/stdc++.h>
using namespace std;
int main()
{// 請在此輸入您的代碼int n,m;cin>>n>>m;int z = m/(n-1);int k = m%(n-1);if(z % 2 == 0){cout<<k<<endl;}else{cout<<n-k+1<<endl;}return 0;
}
3.?巴士接乘【算法賽】
n個點都要經過,兩點都有距離,那最短距離就是不走兩點間最長邊
#include <bits/stdc++.h>
using namespace std;
#define int long longsigned main()
{// 請在此輸入您的代碼int n,m;cin>>n>>m;vector<int> a(n);for(int i=0;i<n;i++){cin>>a[i];}sort(a.begin(),a.end());int ans1 = 0;int ma = 0;for(int i=0;i<n-1;i++){ans1 += (a[i+1] - a[i]);ma = max(ma , (a[i+1] - a[i]));}ma = max(ma , m - a[n-1] + a[0]);ans1 += m - a[n-1] + a[0];ans1 -= ma;cout<<ans1<<endl;return 0;
}
4.?旅行攻略【算法賽】
必須要改一次“QQ" , 如果本來是”QQ" , 記錄出現過 , 最后+1
但是出現“QL" 改為 ”QQ" 記錄一次+1 , 如果下一個“LQ" 就會再次記錄 , 所以”QLQ“跳過
#include <bits/stdc++.h>
using namespace std;
#define int long longsigned main()
{// 請在此輸入您的代碼string s;cin>>s;int n = s.size();int ans = 0;bool flag = false;for(int i=0;i<n-1;i++){if(i > 0 && s[i-1] == 'Q' && s[i] == 'L' && s[i+1] == 'Q'){continue;}if(s[i] == 'Q' && s[i+1] == 'Q'){flag = true;continue;}else{ans++;}}if(flag)ans++;cout<<ans<<endl;return 0;
}
5.?魔王挑戰【算法賽】
貪心:越大的數需要最小的個數
? ? ? ? 大到小排序 , 如果當前x可以 以x為最小值的一組 就ans++?
#include <bits/stdc++.h>
using namespace std;
#define int long longsigned main()
{// 請在此輸入您的代碼//貪心從大到小int n,k;cin>>n>>k;vector<int> a(n,0);for(int i=0;i<n;i++){cin>>a[i];}sort(a.rbegin() , a.rend());int cur = 0;int ans = 0;for(int i=0;i<n;i++){int z = (k+a[i]-1) / a[i];z--;if(z <= cur){ans++;cur -= z;}else{cur++;}}cout<<ans<<endl;return 0;
}
6.?暑假日記【算法賽】
容斥定理 + 二分
二分枚舉需要到達第幾天,才能夠k個
只有公倍數時才會重復,所以容斥 (x + y + z) - (xy + xz + yz) + (xyz)
#include <bits/stdc++.h>
using namespace std;
#define int long longint lcm(int a,int b)
{return a/__gcd(a,b)*b;
}bool check(int x,int y,int z,int k,int f)
{int ans = 0;ans += f / x + f / y + f / z;ans -= f / lcm(x , y) + f / lcm(y , z) + f / lcm(x , z);ans += f / lcm(x , lcm(y , z));return ans >= k;
}signed main()
{// 請在此輸入您的代碼int T;cin>>T;while(T--){//容斥+二分int x,y,z,k;cin>>x>>y>>z>>k;int l = 1 , r = 1e18; //枚舉范圍int ans = 0;while(l <= r){int mid = l + (r - l)/2;if(check(x,y,z,k,mid)){ans = mid;r = mid-1;}else{l = mid+1;}}cout<<ans<<endl;}return 0;
}