题意
题解
0*n+1*n;最大值为甜度,酸度取a,b,分值为a*n+b*n代码
#include
using namespace std;
int main() {
long long a,b,n;//注意爆int
cin>>a>>b>>n;
cout<<n<<' '<<(a+b)*n<<'\n';
return 0;
}
题意
题解
代码
#include
using namespace std;
int main() {
int m;
cin>>m;
cout<<m<<'\n';
for(int i=1;i<=m;i++) cout<<1<<' ';
return 0;
}
题意
n条带美味值粽子,总的美味值计算如下,安排n个粽子吃的顺序,使得总美味值最大
W
=
∑
k
=
1
n
a
k
×
2
k
%
10
,
k
为吃的次序
W=\sum_{k=1}^{n}a_k\times2^{k\%10},k为吃的次序
W=k=1∑nak×2k%10,k为吃的次序
如果有多种符合要求的解,那么把美味值大的放到后面
题解
代码
#include
#include
#include
using namespace std;
const int N=2e5+10;
int n,a[N],ans[N];//记录美味值,记录答案
vector<int> b[12];//记录权值为0~9的位置有哪些
int main() {
cin>>n;
for(int i=1;i<=n;i++) {
cin>>a[i];
b[i%10].push_back(i);//初始化好对应权值的位置
}
sort(a+1,a+1+n);//排序
for(int i=n;i;i--) {//贪心把美味值大的放在权值大的位置
for(int j=9;j>=0;j--) {
if(b[j].size()) {
int x=b[j].back();//从大的位置开始放,满足题目要求
b[j].pop_back();
ans[x]=a[i];//每填一个就break去填下一个
break;
}
}
}
for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
puts("");
return 0;
}
题意
题解
代码
#include
using namespace std;
const int N=2e5+10,M=3e6+10;//数组的大小,筛素数的范围
int n,q,a[N],ans[N];//存每个位置的答案
int cnt,primes[M];//筛素数
bool st[M];
bool vis[M];//找答案的辅助数组
void get_primes() {//线性筛素数
for(int i=2;i<M;i++) {
if(!st[i]) primes[cnt++]=i;
for(int j=0;primes[j]<=M/i;j++) {
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
int main() {
get_primes();
//cout<
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
int p=0;//指向答案的指针
for(int i=1;i<=n;i++) {//遍历每个位置找答案
if(a[i]<M) vis[a[i]]=1;//如果这个数在查找范围内,标记已经出现过
while(vis[primes[p]]) p++;//从前往后单调寻找第一个没有出现的质数
ans[i]=primes[p];//答案
}
while(q--) {
int x; cin>>x;
cout<<ans[x]<<'\n';
}
return 0;
}
题意
给定一个只含有’Z’和’z’的字符串,可以进行删除操作,每次删除一个字符,最多删除k次
求下式的最大值
∑
i
=
1
l
e
n
(
s
)
−
1
w
(
s
i
)
×
w
(
s
i
+
1
)
其中
w
(
Z
)
=
2
,
w
(
z
)
=
0
\sum_{i=1}^{len(s)-1}w(s_i)\times w(s_{i+1})\\ 其中w(Z)=2,w(z)=0
i=1∑len(s)−1w(si)×w(si+1)其中w(Z)=2,w(z)=0
题解
代码
#include
#include
#include
using namespace std;
const int N=2e5+10;
int n,k,ans;
char s[N];
vector<int> sub;//存储z子段的长度
int main() {
cin>>n>>k;
cin>>s+1;
for(int i=1;i<=n;i++) {
int p=i;
while(s[p]==s[i] && p<=n) p++;
p--;
if(s[i]=='Z') ans+=(p-i);//连续的Z子段对答案的贡献
else if(i!=1 && p!=n) sub.push_back(p-i+1);//非两端的z子段记录
i=p;
}
sort(sub.begin(),sub.end());//排序后,贪心删除zz子段
for(auto x:sub)
if(x<=k) {k-=x; ans++;}
cout<<ans*4<<'\n';//每个ZZ的分数为4
return 0;
}
题意
题解
代码
#include
#include
using namespace std;
const int N=2e5+10;
typedef long long LL;
const LL INF=1e18+10;//注意数据范围
int n,m,x,y,z,a[N];//数组为每个节点的性质
int h[N],e[2*N],w[2*N],ne[2*N],idx;//无向图
bool st[N];//最短路
LL dis[N];
void add(int a,int b,int c) {//加一条权值为c的边
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int main() {
cin.tie(0)->sync_with_stdio(false);
cin>>n>>m>>x>>y>>z;
for(int i=1;i<=n;i++) cin>>a[i],h[i]=-1,dis[i]=INF;//初始化
while(m--) {//建图
int u,v;
cin>>u>>v;
if(a[u]==a[v]) {
add(u,v,min(x,y+z));
add(v,u,min(x,y+z));
}
else {
add(u,v,min(y,x+z));
add(v,u,min(y,x+z));
}
}
//spfa最短路
dis[1]=0;
queue<int> q;
q.push(1); st[1]=1;
while(q.size()) {
int t=q.front();q.pop(); st[t]=0;
for(int i=h[t];~i;i=ne[i]) {
int j=e[i];
if(dis[j]>dis[t]+w[i]) {//注意是dis[t]和w[i]
dis[j]=dis[t]+w[i];
if(!st[j]) q.push(j),st[j]=1;
}
}
}
cout<<dis[n]<<'\n';//输出最短路答案
return 0;
}