C 阿宁吃粽子
先求出每一位要分配几个粽子,然后贪心的从大到小分配(每种主意把美味值大的放后面)
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef unsigned long long ull;
typedef long long ll;
const int N = 1e6+10;
const int NN = 1e5+100;
const int pp = 998244353;
typedef pair<int,int>PII;
const int inf = 2147483647;
bool cmp(int c,int d){
return c>d;
}
int n,a[N];
int b[11],d[11];
int c[10][NN];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i%10]++;
}
sort(a+1,a+1+n,cmp);
int kk=0;
for(int i=9;i>=0;i--){//先放大的
for(int j=b[i];j>=1;j--){//大的后置
c[i][j]=a[++kk];
}
}
for(int i=1;i<=n;i++){
int f = i%10;
cout<<c[f][++d[f]]<<" ";
}
return 0;
}
D 阿宁的质数
最多 2e5 个质数
线性筛出前 2e5 质数 ,放入set 中,每次遇到素数就在set中删除,然后取出set头部元素,既是要找的答案;
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef unsigned long long ull;
typedef long long ll;
const int N = 3e6;
const int NN = 2e5+10;
const int pp = 998244353;
typedef pair<int,int>PII;
const int inf = 2147483647;
set<int>st;
int prime[N+10],cnt,n,q,k;
bool vis[N+10];
int a[NN],ans[NN];
void isprime(){
vis[1]=1;
vis[0]=1;
for(int i=2;i<=N;i++){
if(!vis[i]){
prime[++cnt]=i;
st.insert(i);
}
for(int j=1;j<=cnt&&i*prime[j]<=N;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int main(){
isprime();
cin>>n>>q;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]>3000000){
ans[i]=*st.begin();
}else if(!vis[a[i]]){
st.erase(a[i]);
ans[i]=*st.begin();
}else{
ans[i]=*st.begin();
}
}
for(int i=1;i<=q;i++){
scanf("%d",&k);
printf("%d\n",ans[k]);
}
return 0;
}
E 阿宁睡大觉
找出所有‘Z’之间的距离,贪心消除即可
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef unsigned long long ull;
typedef long long ll;
const int N = 2e5+10;
const int NN = 2e5+10;
const int pp = 998244353;
typedef pair<int,int>PII;
const int inf = 2147483647;
int n,m,f;
string s;
vector<int>ve;
ll ans;
int main(){
cin>>n>>m>>s;
int len = s.size();
for(int i = 0 ; i < len ; i++){
if(s[i] == 'Z'){
f = i;
break;
}
}
for(int i = f + 1 ;i < len ; i++ ){
if(s[i]=='Z'){
ve.push_back(i-f-1);
f = i;
}
}
sort(ve.begin(),ve.end());
for(auto k : ve){
if(m>=k){
ans+=4;
m-=k;
}
}
cout<<ans;
return 0;
}
反思:注意多举例子多举例子
F 阿宁去游玩
魔法可以使用无数次,也就是说两个城市之间的状态可以相同也可以不同,每次添加两个城市之间最小权值跑最短路
注意,当在一个节点使用魔法时,其他任意两个节点的相对属性是不变的,使用魔法前两个节点属性不同使用后属性依然不同
注意数组大小
注意初始化大小
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef long long ull;
typedef unsigned long long ll;
const int N = 1e6+10;
const int NN = 1e6+100;
const int pp = 1e9+7;
typedef pair<int,int>PII;
const ll inf = 1e18 + 10;
priority_queue<PII,vector<PII>,greater<PII> >qu;
int to[N],head[N],nex[N],val[N],cnt,u,v,w,n,m,x,y,z;
bool vis[N];
ll dis[N];
int s[N];
void add(int u,int v,int w)
{
to[++cnt]=v;
val[cnt]=w;
nex[cnt]=head[u];
head[u]=cnt;
}
//一定是 ++cnt
int main()
{
cin>>n>>m>>x>>y>>z;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++) dis[i]=inf;
dis[1]=0;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
if(s[u]==s[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));
}
}
qu.push({0,1});
while(!qu.empty())
{
int t=qu.top().se;
qu.pop();
if(vis[t]) continue;
else vis[t]=1;
for(int i=head[t];i;i=nex[i])
{
if(dis[t]+val[i]<dis[to[i]])
{
dis[to[i]]=dis[t]+val[i];
qu.push({dis[to[i]],to[i]});
}
}
}
cout<<dis[n];
}