2024.4.7 训练2(比赛) 无锡学院2024年ACM大学生程序设计竞赛校选赛
Posted on 2024-04-08 16:21 qiujian222 阅读(55) 评论(0) 编辑 收藏 举报比赛链接:https://ac.nowcoder.com/acm/contest/79592#question
A题
算法小白会直接猜规律,高手大佬可以先打表然后直接证明出结论,废物半吊子选手会试图利用半桶水的知识去推导证明结果导致放弃找规律,然后卡题TLE然后去想降复杂度。
正解:打表
观察猜测 ans=a+b ,交一发就能过,我在赛场上压根就没往这么简单的方向想。
#include <bits/stdc++.h>
using namespace std;
int main(){
long long a,b; cin>>a>>b;
cout<<a+b;
return 0;
}
B题
暴力卡过去了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll n,m; cin>>n>>m; ll flag=0;
for(int i=0;i<=10000005;i++){
if((m+i)%(n+i)==0){
cout<<i;
flag=1;
break;
}
}
if(!flag) cout<<-1;
return 0;
}
C题
看cuibo的用前缀和处理掉了查询的时间问题,nice。前缀和记录每一个位置上每个数的出现次数,最后枚举边界扩展即可。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll pre[10][1000000];
void solve(){
string s; cin>>s;
s='0'+s; ll ans=0;
ll n=s.size()-1;
for(ll i=1;i<=n;i++){
pre[s[i]-'0'][i]=pre[s[i]-'0'][i-1]+1;
for(ll k=0;k<=9;k++){
if(k!=s[i]-'0') pre[k][i]=pre[k][i-1];
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
ll x=s[j]-'0';
if(pre[x][j]-pre[x][i-1]<=x) ans++;
else break;
}
}
cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
//ll t; cin>>t; while(t--)
solve();
return 0;
}
D题
打表,没啥好说的
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool check(ll x) {
if (x <= 2) {
return false;
}
for (ll i = 2; i <= x / i; i ++) {
if (x % i == 0) {
return false;
}
}
return true;
}
void solve(){
ll n; cin >> n;
if (check(n + 1)) {
cout << n << endl;
} else if (n == 3) {
cout << 2 << endl;
} else if (n == 1) {
cout << 1 << endl;
} else {
cout << 0 << endl;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
solve();
return 0;
}
E题
根据公式,a为钞票面额,x为钞票数量,想要买到任何一个商品,必须满足所有面额的最大公约数可以被该商品价格整除。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
void solve(){
int n, m;
cin >> n >> m;
vector<int> a(n + 1), b(m + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= m; i++) cin >> b[i];
int g = 0;
for (int i = 1; i <= n; i++) g = gcd(g, a[i]);
int cnt = 0;
for (int i = 1; i <= m; i++) {
if (b[i] % g) cnt++;
}
cout << cnt << endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
//ll t; cin>>t; while(t--)
solve();
return 0;
}
F题
比赛的时候理解错题目意思了,题目说反转,还以为是二进制按位取反,实际上是翻转
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100000000]; ll n;
void solve(){
cin >> n ;
for(int i = 0 ; ; ++ i ) {
if( n == (1<<i)) {
n = i ; break ;
}
}
for(int i = 0 ; i < (1<<n) ; ++ i ) cin >>a[i];
for(int i = 0 ; i < (1<< n) ; ++ i ) {
int cur = 0 ;
for(int j = 0 ;j < n ; ++ j )
if( i >> j & 1 ) cur |= 1<<( n -1 - j ) ;
cout << a[cur ] <<" ";
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
//ll t; cin>>t; while(t--)
solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理