The 2023 ICPC Asia Taoyuan Regional Programming Contest
The 2023 ICPC Asia Taoyuan Regional Programming Contest(A,B,D,F,H,M)
原题链接:https://codeforces.com/gym/105544
A.Counterfeit Money
思路:根据题意将字符串分割成若干组,每组有三个元素,然后±交替进行的到最后的总和,判断总和是否能被13整除
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;void solve(){ string s;cin>>s;reverse(s.begin(),s.end()); //翻转s更好处理vector<int>vec;for(int i=0;i<s.size();i+=3){ //以3为步长string str=s.substr(i,3);reverse(str.begin(),str.end()); vec.push_back(stoi(str)); }int ok=1,sum=0;for(auto it:vec)if(ok) sum+=it,ok=0;else sum-=it,ok=1;if(sum%13==0){cout<<abs(sum)<<" "<<"YES"<<endl;}else cout<<abs(sum)<<" "<<"NO"<<endl;}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int t;cin>>t;while(t--)solve();
}
M. Task scheduler
思路:按照题目所给的排序最后输出排序后的结果
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
typedef pair<int,int>PII;PII a[N];bool cmp(PII a,PII b){if(a.second==b.second) return a.first<b.first;return a.second<b.second;}void solve(){ int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i].first;for(int i=1;i<=n;i++) cin>>a[i].second;sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++)cout<<a[i].first<<" ";cout<<endl;}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int t;cin>>t;while(t--)solve();
}
H. Bank Deposit Challenge
思路:很裸露的一道01背包板题,需要注意的是处理字符串分割,获取v,w
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int n,m,f[N]; vector<int>split(string s){istringstream iss(s);vector<int>tokens;string stoken;while(iss>>stoken)tokens.push_back(stoi(stoken));return tokens;
} void solve(){ cin>>m;string s;getline(cin,s);getline(cin,s);vector<int>w=split(s);getline(cin,s);vector<int>v=split(s);for(int i=0;i<w.size();i++)for(int j=m;j>=v[i];j--)f[j]=max(f[j],f[j-v[i]]+w[i]);cout<<f[m]<<endl; }int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
// int t;
// cin>>t;
// while(t--)solve();
}
B - Recurring Decimal to Fractions
思路:给你一个小于0的小数,一部分是非循环节,一部分是循环节,最后让你求出分子和分母的最简之比
通过数学表示将循环节去掉表示成分数的形式,然后再用gcd求出最大公约数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;ll gcd(ll a, ll b)
{return b ? gcd(b, a % b) : a;
}void solve()
{ll n, m;cin >> n >> m;ll b, c;cin >> b >> c;ll fz = b * (pow(10, m) - 1) +c;ll fm = (pow(10, m) - 1) * pow(10, n);ll w = gcd(fz, fm);ll ans1 = fz / w, ans2 = fm / w;cout << ans1 << " " << ans2 << endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int t;cin >> t;while (t--)solve();
}
D. Quarantine Policy
思路:模拟题,跟着题意描述模拟即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N=500;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; //上下左右四个方向
int dxx[4]={-1,-1,1,1},dyy[4]={-1,1,1,-1}; //左上右上左下右下四个方向void solve() {int t;cin>>t;for (int w=1;w<=t;w++){int n,m,d1,d2;cin>>n>>m>>d1>>d2;vector<vector<char>>vec(n+10,vector<char>(m+10,0));vector<vector<int>>ans(n+10,vector<int>(m+10,0));for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)cin>>vec[i][j];for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (vec[i][j]=='V'){for (int k=0;k<4;k++){int a=i+dx[k],b=j+dy[k];if (a<1||a>n||b<1||b>m) continue;ans[a][b]=max(ans[a][b],d1);}for (int k=0;k<4;k++){int a=i+dxx[k],b=j+dyy[k];if (a<1||a>n||b<1||b>m) continue;ans[a][b]=max(ans[a][b],d2);}}cout<<"Airplane #"<<w<<":"<<endl;for (int i=1;i<=n;i++){for (int j=1;j<=m;j++)if (vec[i][j]=='V') cout<<vec[i][j];else cout<<ans[i][j];cout<<endl;}}}int main()
{ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);// int t;// cin>>t;// while (t--)solve();
}
F - Baker’s Dilemma
思路:耍杂技的牛的问题,两个物品谁在前谁在后可能会对结果造成不同的影响,根据通项推公式得到一个排序方式,则按照这个排序方式执行命令则最后的花费最小
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
typedef struct node{ll id,x,y;
};
node a[N];bool cmp(node a,node b){if(a.x*b.y==a.y*b.x) return a.id<b.id;return a.x*b.y<a.y*b.x;
}void solve(){int n;cin>>n;for(int i=1;i<=n;i++){a[i].id=i;cin>>a[i].x>>a[i].y; }sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++)cout<<a[i].id<<" ";cout<<endl;}int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int t;cin>>t;while(t--)solve();}