牛客竞赛语法入门班数组栈、队列和stl习题
A-老子的全排列呢
解法1:神仙 ------> next_permutation();(还有prev_permutation();)
用法:如果存在下一个字典序则返回true,否则返回false
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//输出1-8的全排列
int main(){
int a[]={1,2,3,4,5,6,7,8};
do{
for(int i=0;i<7;i++)
printf("%d ",a[i]);
printf("%d\n",a[7]);
}while(next_permutation(a,a+8));
return 0;
}
next_permutation():
1.对1,1,2的排序{1,1,2} {1,2,1} {2,1,1}(排除了重复的)
2.可以选则区间排字母序
解法2 :dfs实现全排列
B-装进肚子
先全部糖都早上吃,然后记录每个糖换成晚上吃能多多少甜蜜值,sort排序(默认升序)后加上最大的n-k个delt(表示差值)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
char ch=getchar();int s=0,w=1;
while(ch<48||ch>57){
if(ch=='-')w=-1;ch=getchar();
}
while(ch>=48&&ch<=57){
s=(s<<1)+(s<<3)+ch-48;ch=getchar();
}
return s*w;
}
inline void write(ll x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
int delt[100010],morning[100010],evening[100010];//delt=evening-morning
int main(){
int n,k;
n=read(),k=read();
//假设全部都早上吃
ll sum=0;
for(int i=0;i<n;i++){
morning[i]=read();
sum+=morning[i];
}
for(int i=0;i<n;i++)
evening[i]=read();
for(int i=0;i<n;i++)
delt[i]=evening[i]-morning[i];
sort(delt,delt+n);
for(int i=n-1;i>=k;i--){
sum+=delt[i];
}
write(sum);
return 0;
}
C-牛牛的三角形
跟上题差不多,对边长进行排序,后面进行判断就行
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
char ch=getchar();int s=0,w=1;
while(ch<48||ch>57){
if(ch=='-')w=-1;ch=getchar();
}
while(ch>=48&&ch<=57){
s=(s<<1)+(s<<3)+ch-48;ch=getchar();
}
return s*w;
}
inline void write(ll x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
int eage[110];
int main(){
int n;
n=read();
for(int i=0;i<n;i++)
eage[i]=read();
sort(eage,eage+n);
bool treck=false;
for(int i=2;i<n;i++){
if(eage[i]<eage[i-1]+eage[i-2]){
treck=true;
printf("%d %d %d",eage[i-2],eage[i-1],eage[i]);
break;
}
}
if(!treck)printf("No solution");
return 0;
}
D-[NOIP1998]拼数
偷瞄了一眼题解,真的好聪明啊啊啊啊,比较两个字符串,如果a+b>b+a,那么就把a放在前面
#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
char ch=getchar();int s=0,w=1;
while(ch<48||ch>57){
if(ch=='-')w=-1;ch=getchar();
}
while(ch>=48&&ch<=57){
s=(s<<1)+(s<<3)+ch-48;ch=getchar();
}
return s*w;
}
bool cmp(string a,string b){
return a+b>b+a;
}
int main(){
int n;
n=read();
string s[n];
for(int i=0;i<n;i++)
cin>>s[i];
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
cout<<s[i];
return 0;
}
E-好串
这里找到规律真的超级简单:1.字符串中a和b的数量相同
2.前i个元素中(i是小于n的任意正整数),a的个数总大于b的个数(注意到插入的顺序a就是在b的前面所以当然任意前i个元素中,a的数量比b多)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
string s;
cin>>s;
int cnt_a=0,cnt_b=0,i;
for(i=0;i<s.size();i++){
if(s[i]=='a')++cnt_a;
else ++cnt_b;
if(cnt_b>cnt_a)break;
}
if(i==s.size() && cnt_a==cnt_b)cout<<"Good";
else cout<<"Bad";
return 0;
}