20257月29日-8月2日训练日志
2024睿抗国赛
RC-u1 大家一起查作弊
模拟题
#include <bits/stdc++.h>
#define endl "\n"
#define FAST ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
using namespace std;void solve(){string s;int sco = 0,len = 0,count = 0;while(getline(cin,s)){s+="\n";int n = s.size();string ss = "";for(int i=0;i<n;i++){if((s[i]>='A'&&s[i]<='Z') || (s[i]>='a'&&s[i]<='z') || (s[i]>='0'&&s[i]<='9')){ss.push_back(s[i]);}else{len+=ss.size();if(ss.size())count++;bool da = 0,xiao = 0,shuzi = 0;for(int u=0;u<ss.size();u++){if(ss[u] >= 'A' && ss[u] <= 'Z'){da = 1;}else if(ss[u] >= 'a'&&ss[u]<='z'){xiao = 1;}else if(ss[u]>='0' && ss[u]<='9'){shuzi = 1;}}if(da && xiao && shuzi){sco += 5;}else if((da&&shuzi) || (xiao&&shuzi)){sco+=3;}else if(da&&xiao){sco+=1;}ss = "";}}}cout<<sco<<endl<<len<<" "<<count;
}signed main() {FASTint t = 1;//cin>>t;while(t--)solve();return 0;
}
RC-u2 谁进线下了?II
用好STL的话这个题就很简单了
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define FAST ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
using namespace std;
int arr[21] = {0,25,21,18,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
void solve(){int n;cin>>n;unordered_map<int,int>mp;for(int i=0;i<n*20;i++){int c,p;cin>>c>>p;mp[c] += arr[p];}vector<pair<int,int>>a;for(auto [c,p] : mp){a.push_back({c,p});}sort(a.begin(),a.end(),[](auto a,auto b){if(a.second == b.second) return a.first<b.first;return a.second > b.second;});for(auto [c,p] : a){cout<<c<<' '<<p<<endl;}
}signed main() {FASTint t = 1;//cin>>t;while(t--)solve();return 0;
}
RC-u3 势均力敌
题目的数据只在3和4,因此可以进行两次DFS,第一次求n个数的全排列,第二次求满足条件的组。
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define FAST ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
using namespace std;
int n;
int a[4];//原始数据
int cou = 1;//阶乘,也就是所有数的个数
vector<int>qpl;//全排列
vector<bool>v1(4,0),v2(24,0);
int ss = 0;//全排列里面所有数的总和
vector<int>ans;
int f = 0;void dfs1(int x,int num){if(x==n){qpl.push_back(num);return ;}for(int i=0;i<n;i++){if(!v1[i]){v1[i] = 1;dfs1(x+1,num*10+a[i]);v1[i] = 0;}}
}void dfs2(int start,int sum){if(sum > ss/2) return ;if(sum == ss/2 && ans.size() == cou/2){for(int num : ans){cout<<num<<endl;}f = 1;return ;}for(int i=start;i<cou;i++){if(!v2[i]){v2[i] = 1;ans.push_back(qpl[i]);dfs2(i+1,sum+qpl[i]*qpl[i]);if(f) return ;ans.pop_back();v2[i] = 0;}}
}void solve(){cin>>n;for(int i=0;i<n;i++){cin>>a[i];cou*=i+1;}dfs1(0,0);for(int i=0;i<cou;i++){ss+=qpl[i] * qpl[i];}sort(qpl.begin(),qpl.end());dfs2(0,0);
}signed main() {FASTint t = 1;//cin>>t;while(t--)solve();return 0;
}
二分答案
1283. 使结果不超过阈值的最小除数 - 力扣(LeetCode)
假设除数为m,根据题意,每个数除以m向上取整,元素和为
由于m越大,上式越小,有单调性,可以二分答案。
最小的满足
的m就是答案
class Solution {
public:int smallestDivisor(vector<int>& nums, int threshold) {auto check = [&](int m){int sum = 0;for(int num : nums){sum += (num + m - 1)/m;if(sum > threshold)return false;}return true;};int l=0,r =ranges::max(nums);while(l + 1 < r){int mid = (l+r)/ 2;(check(mid)?r:l) = mid;}return r;}
};
2187. 完成旅途的最少时间 - 力扣(LeetCode)
时间越多,可以完成的旅途也就越多,有单调性,可以二分答案。
问题变成:
- 每辆车都用时 x,总共能完成多少趟旅途?能否达到 totalTrips?
class Solution {
public:long long minimumTime(vector<int>& time, int totalTrips) {auto check = [&](long long x){long long sum = 0;for(int t : time){sum += x/t;if(sum >= totalTrips) return true;}return false;};int mint = ranges::min(time);long long l = mint - 1;long long r = 1LL * mint * totalTrips;while(l+1 < r){long long mid = l + (r-l) / 2;(check(mid)?r:l) = mid;}return r;}
};
西安校赛
Pythagorean Cup - Gym 105937E - Virtual Judge
思维,根据半杯出现的位置离右边的距离求和,然后奇偶判断
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define FAST ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
using namespace std;void solve(){string s;cin>>s;int n = s.size();int cnt = 0;for(int i=0;i<n;i++){if(s[i] == 'H'){cnt += n-i;}}if(cnt&1) cout<<"Alice";else cout<<"Bob";
}signed main() {FASTint t = 1;//cin>>t;while(t--) solve();return 0;
}
P12531 [XJTUPC 2025] Beat Verdict: Precision Strike - 洛谷
人生第一个交互题,虽然看题解写出来了但是还是依然的懵b
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define FAST ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
using namespace std;int c[20];void solve(){int n;cin>>n;int l = 1,r = 2;for(int i=1;i<=16;i++)if(c[i]*2 < n)r++;while(l + 1 < r){int mid = (l+r) >>1;cout<<"? "<<c[mid]/2<<endl;cout.flush();int f;cin>>f;if(f) r = mid;else l = mid;}if(c[l] > n) cout<<"! "<<n<<endl;else cout<<"! "<<c[l]<<endl;cout.flush();
}signed main() {FASTint t = 1;cin>>t;c[1] = 2;for(int i=2;i<=16;i++)c[i] = (c[i-1] * 2 + 1) * 2;while(t--) solve();return 0;
}
P12540 [XJTUPC 2025] 离散对数 - 洛谷
给定正整数 a,c,p,保证 p 是素数,求 b 使得:
。
模数 p 是质数,费马小定理:如果 p 是一个质数,而整数 a 不是 p 的倍数,则有
的结论。
容易发现,当
时,可以满足条件。
代入原式,如下:
。
。
于是,
就是答案。那么题目输入完后,直接输出即可。
摘自题解
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define FAST ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);
using namespace std;void solve(){int a,c,p;cin>>a>>c>>p;cout<<(p-1)*(p-1);
}signed main() {FASTint t = 1;//cin>>t;while(t--) solve();return 0;
}