题目链接 https://vjudge.net/contest/280315#overview
以及Power o j1053
1053: 合并果子
题目链接 https://www.oj.swust.edu.cn/problem/show/1053
优先队列从小到大排好,取出前两个,合并,再插入合并之后的
优先队列版本和set版本
multiset是不去重的set
erase是删除
#include<bits/stdc++.h>
using namespace std;
struct node{
int x;
node(){}
node(int x):x(x){}
friend bool operator <(node a,node b)
{
return a.x>b.x;
}
};
priority_queue<node>q;
int main()
{
int n,x;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
q.push(node(x));
}
int ans=0;
while(q.size()!=1)
{
int a=q.top().x;
q.pop();
int b=q.top().x;
q.pop();
ans+=(a+b);
q.push(a+b);
}
cout<<ans;
}
#include <iostream>
#include <stack>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
#include <math.h>
#include<set>
using namespace std;
multiset<int>s;
int main()
{
int n,x;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
s.insert(x);
}
int ans=0;
while(s.size()!=1)
{
int a=*s.begin();
s.erase(s.begin());
int b=*s.begin();
s.erase(s.begin());
s.insert(a+b);
ans+=(a+b);
}
printf("%d",ans);
}
D - Train Problem I
第一个串依次进栈,如果和第二个串开始的相等 就out
有点像贪心
比如说 5 12345 14325
1和第一个相等先in 再 out 变成 2345 4325
然后一直in 直到 in 首字母相等 4 开始 out
out 完后栈顶还是和他相等的 继续 out
#include <iostream>
#include <stack>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
#include <math.h>
#include<set>
using namespace std;
int main()
{
int n;
char str1[10005];
char str2[10005];
stack<char>s;
queue<int>q;
while(scanf("%d%s%s",&n,str1,str2)!=EOF)
{
while(!q.empty())
q.pop();
while(!s.empty())
s.pop();
int j=0;
for(int i=0; i<n; i++)
{
s.push(str1[i]);
q.push(1);//in是1
while(!s.empty()&&s.top()==str2[j])
{
s.pop();
q.push(-1);//out 是-1
j++;
}
}
if(!s.empty())
printf("No.\n");
else
{
printf("Yes.\n");
while(!q.empty())
{
if(q.front()==1)
printf("in\n");
else
printf("out\n");
q.pop();
}
}
printf("FINISH\n");
}
}
E - 士兵队列训练问题
一开始理解错题意了
原来是每报一次数判断一次是否大于3
定义了两个队列
来回跑
#include <iostream>
#include <stack>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
#include <math.h>
#include<set>
using namespace std;
queue<int>q;
queue<int>p;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int cas=1; cas<=n; cas++)
{
int num;
num=cas;
// printf("%d ",cas);
scanf("%d",&num);
if(num<=3)
{
if(num==1)
printf("1\n");
else if(num==2)
printf("1 2\n");
else if(num==3)
printf("1 2 3\n");
continue;
}
while(!q.empty())
q.pop();
while(!p.empty())
p.pop();
for(int i=1; i<=num; i++)
q.push(i);
int flag=0;
while(q.size()>3)
{
int i=0;
while(!q.empty())
{
i++;
if(i%2!=0)
p.push(q.front());
q.pop();
}
if(p.size()<=3)
break;
i=0;
while(!p.empty())
{
i++;
if(i%3!=0)
q.push(p.front());
p.pop();
}
}
int i=0;
int a[3];
while(!q.empty())
{
a[i]=q.front();
i++;
q.pop();
}
while(!p.empty())
{
a[i]=p.front();
i++;
p.pop();
}
sort(a,a+i);
for(int j=0;j<i;j++)
{
if(j!=0)
printf(" ");
printf("%d",a[j]);
}
printf("\n");
}
}
}
F - 看病要排队
优先队列
定义结构体
按照优先级排序 优先级相同的按照 先后出现的次序排序
模拟一下就可以了
#include <iostream>
#include <stack>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
#include <math.h>
#include<set>
using namespace std;
struct node
{
int youxianji;
int id;
node() {}
node(int x,int y)
{
youxianji=x;
id=y;
}
friend operator < (node a,node b)
{
if(a.youxianji<b.youxianji)
return true;
else if(a.youxianji==b.youxianji)
{
return a.id>b.id;
}
return false;
}
};
priority_queue<node>q[10];
int main()
{
int n;
int a,b;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<10;i++)
while(!q[i].empty())
q[i].pop();
char s[10];
int cas=1;
for(int i=1; i<=n; i++)
{
scanf("%s",s);
if(s[0]=='I')
{
scanf("%d%d",&a,&b);
q[a].push(node(b,cas));
cas++;
}
else if(s[0]=='O')
{
scanf("%d",&a);
if(q[a].empty())
printf("EMPTY\n");
else
{
printf("%d\n",q[a].top().id);
q[a].pop();
}
}
}
}
}
G - New Year and the Christmas Ornament
#include <bits/stdc++.h>
using namespace std;
int main() {
int y, b, r;
cin >> y >> b >> r;
cout << min(y, min(b - 1, r - 2)) * 3 + 3 << endl;
return 0;
}
I - Ultra-Fast Mathematician
不相等就1相等就0
#include <iostream>
#include <stack>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <string.h>
#include <math.h>
#include<set>
using namespace std;
int main()
{
char s1[105];
char s2[105];
scanf("%s",s1);
scanf("%s",s2);
int len=strlen(s1);
for(int i=0;i<len;i++)
{
if(s1[i]!=s2[i])
printf("1");
else printf("0");
}
}