A:算出了几个i9
题解:可以利用数学公式求解,设i9数量为x,i5数量为y,则8x+16y=a,6x+8y=b,进而求得y=(2a-b)/4,x=(a-6y)/8;
参考代码:
#include<bits/stdc++.h>
using namespace std;
int a,b,x,y;
int main(){
cin>>a>>b;
y=(2*a-b)/4;
x=(a-6*y)/8;
cout<<x<<' '<<y;
return 0;
}
B:地区的调度问题
知识点:贪心
题解:我们这样来看这个问题,公司首先将这 2N 个人全都安排飞往 A 市,再选出 N 个人改变它们的行程,让他们飞往 B 市。如果选择改变一个人的行程,那么公司将会额外付出 price_B - price_A 的费用,这个费用可正可负。因此最优的方案是,选出 price_B - price_A
最小的 N 个人,让他们飞往 B
市,其余人飞往 A
市。
参考代码:
#include<bits/stdc++.h>
using namespace std;
int n,s;
struct node{
int x,y,z;
bool operator<(const node & b) const{
return z<b.z;
}
}a[101];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
a[i].z=a[i].y-a[i].x;
s+=a[i].x;
}
sort(a+1,a+1+n);
for(int i=1;i<=n/2;i++){
s+=a[i].z;
}
cout<<s;
return 0;
}
C:玩字符串的 Didi
知识点:字符串、排序
题解:由于每次选择的区间左端点不能小于之前选择的区间左端点,所以显然可以考虑从小到大考虑每个位置作为左端点时需要做到多少。对于 si 来说,如果它与 ti 一致,显然就不需要操作了,否则就需要在 s 串的 si 后面去找 ti,假设在 spos 的位置。此时显然就需要对 si∼spos 进行排序。因为如果对更短的区间排序,显然不可能有效。对更长的区间排序则有可能会变得更坏,不如回头再扩展到更长。如果排完序后一致,就可以处理下一个位置了,否则就说明不可能完成目标了。
参考代码:
#include<bits/stdc++.h>
using namespace std;
string a,b;
int main(){
cin>>a>>b;
for(int i=0;i<int(a.size());i++){
if(a[i]==b[i]) continue;
int pos=-1;
for(int j=i+1;j<int(b.size());j++){
if(a[j]==b[i]){
pos=j;
break;
}
}
if(pos==-1){
cout<<"No";
return 0;
}
//从i的位置到pos的位置进行排序
for(int j=i;j<=pos;j++){
for(int k=j+1;k<=pos;k++){
if(a[k]<a[j]){
swap(a[k],a[j]);
}
}
}
if(a[i]!=b[i]){
cout<<"No";
return 0;
}
}
cout<<"Yes";
return 0;
}
D:方格取数
知识点:递推转移
思路:可以从上下右边的方向出发,考虑使用两个数组来进行出发一个是右上一个是右下,最后同时进行更新最大,注意循环需要列在外,从最左边出发。
参考代码:
#include<iostream>
using namespace std;
int n,m;
long long a[1011][1011],f[1011][1011],g[1011][1011];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<=n+1;i++){
for(int j=0;j<=m+1;j++){
f[i][j]=g[i][j]=-1e16-10;
}
}
f[1][1]=a[1][1];
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
f[i][j]=g[i][j]=max(f[i][j],f[i][j-1]+a[i][j]);
}
for(int i=1;i<=n;i++){
f[i][j]=max(f[i][j],f[i-1][j]+a[i][j]);
}
for(int i=n;i>=1;i--){
g[i][j]=max(g[i][j],g[i+1][j]+a[i][j]);
}
for(int i=1;i<=n;i++){
f[i][j]=max(g[i][j],f[i][j]);
}
}
cout<<f[n][m];
return 0;
}