本次只在开场做出了A,C两道题。无奈太困了,直接睡觉了。
简单题,不解释。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int a[110];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
int l,r,cnt=0;
while(n--){
scanf("%d%d",&l,&r);
for(int i=l;i<=r;i++){
if(!a[i]) cnt++,a[i]=1;
}
}
if(cnt==m){
printf("0\n");
}else{
printf("%d\n",m-cnt);
bool flag=false;
for(int i=1;i<=m;i++){
if(!a[i]){
if(flag) printf(" %d",i);
else{
printf("%d",i);
flag=true;
}
}
}
}
return 0;
}
模拟题,类似于冒泡排序。比赛过程中太困了,没怎么看这道题。
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=55;
char s[maxn],t[maxn];
int main(){
int n;
vector<int>v;
scanf("%d",&n);
scanf("%s%s",s,t);
//printf("%s\n%s\n",s,t);
int ans=0;
for(int i=0;i<n;i++){
int j;
for(j=i;s[j]!=t[i]&&j<n;j++);
//cout<<i<<" "<<j<<endl;
if(j==n){
printf("-1\n");
return 0;
}
for(int k=j;k>i;k--){
v.push_back(k); //因为s[]下标从0开始
swap(s[k-1],s[k]);
}
ans+=j-i;
}
printf("\n%d\n",ans);
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++){
if(it==v.begin()){
printf("%d",*it);
}else printf(" %d",*it);
}
printf("\n");
return 0;
}
(贪心)注意:greater<int>() 头文件为:#include<functional>
简单题,不解释。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn],d[maxn];
long long sa=0,sb=0;
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
sa+=a[i];
sb+=b[i];
d[i]=a[i]-b[i];
}
int cnt=0;
if(sa<=m) cnt=0;
else if(sb>m) cnt=-1;
else if(sb==m) cnt=n;
else{
sort(d+1,d+1+n,greater<int>());
for(int i=1;i<=m;i++){
//cout<<"cnt="<<cnt<<endl;
sa-=d[i];
cnt++;
if(sa<=m) break;
}
}
printf("%d\n",cnt);
return 0;
}
题意:总共有n个房子,编号从1-n。问移动k次,总移动步数为s能否实现,实现的话输出移动情况?规定两房子编号之差为移动步数。(贪心;每次移动选取当前能够移动的最大步数)
//贪心
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
long long n,k,s;
scanf("%lld%lld%lld",&n,&k,&s);
long long mindist=k,maxdist=k*(n-1);
if(mindist>s||maxdist<s) printf("NO\n");
else{
printf("YES\n");
long long pos=1;
long long minmove,cur;
for(int i=1;i<=k;i++){
minmove=k-i;
cur=min(s-minmove,n-1);
s-=cur;
if(cur+pos<=n){
pos+=cur;
printf("%lld ",pos);
}else{
pos-=cur;
printf("%lld ",pos);
}
}
}
return 0;
}
E1.Stars Drawing (Easy Edition)
E2.Stars Drawing (Hard Edition)