1.Educational Codeforces Round 75 (Rated for Div. 2) E1
看第七题。
2.Educational Codeforces Round 75 (Rated for Div. 2) C
题意:给定一个数串,只能交换相邻奇偶数,但交换次数不限。求如果把它看作一个多位数能够得到的最小的值(可以有前导零)。
奇数间或者偶数间的顺序不变,只看奇偶数怎样穿插,这个看到这个题的时候还真没想到,这样就只要优先输出小的就可以了。
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const int maxn=3*1e5;
const int mx=(1<<20)+99;
int n,m,maxx,ans,aans,nume,numo,a[maxn+10],b[maxn+10];
string s;
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
for(int o=1;o<=t;o++)
{
cin>>s;
n=s.size();
nume=numo=0;
for(int i=0;i<n;i++)
{
if((s[i]-'0')%2) a[++numo]=s[i]-'0';
else b[++nume]=s[i]-'0';
}
/*for(int i=1;i<=numo;i++)
cout<<a[i];
cout<<endl;
for(int i=1;i<=nume;i++)
cout<<b[i];
cout<<endl;*/
//cout<<"even:"<<nume<<"\todd:"<<numo<<endl;
for(int i=1,j=1,k=1;k<=n;k++)
{
//cout<<endl<<i<<" "<<j<<" "<<k<<endl;
if((a[i]<b[j]&&i<=numo&&j<=nume)||j>nume) cout<<a[i++];
else cout<<b[j++];
}
cout<<endl;
}
return 0;
}
3.Educational Codeforces Round 75 (Rated for Div. 2) A
题意:给定一个字符串,其中只能以连续两个(或者偶数个)出现的字母对应键盘可能出故障,而且只要出现奇数个连着的就说明没有故障,输出字符串中没有故障的字母,并以字典序输出。
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const int maxn=2*1e5;
const int mx=(1<<20)+99;
int n,m,maxx,ans,aans,flag,a[30];
string s;
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
for(int o=1;o<=t;o++)
{
memset(a,0,sizeof(a));
cin>>s;
n=s.size();
for(int i=0;i<n;i++)
{
if(i==n-1||(i!=n-1&&s[i]!=s[i+1])) a[s[i]-'a']=1;
else if(i!=n-1&&s[i]==s[i+1]) i++;
}
for(int i=0;i<=26;i++)
{
if(a[i]) cout<<char(i+'a');
}
cout<<endl;
}
return 0;
}
4.Educational Codeforces Round 75 (Rated for Div. 2) D
题意:有s元钱,n个员工。每个人有一个工资范围,用s元钱给工资(不必全给)后,求员工工资的中位数最大能得到多少。
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const int maxn=2*1e5;
const int mx=(1<<20)+99;
ll m,n;
struct lll
{
int l,r;
}v[maxn+10];
bool cmp(lll a,lll b)
{
return a.l<b.l;
}
bool st(ll mid,int n,ll m)
{
ll ans=n/2+1,ant=0,cost=0;
for(int a=n-1;a>=0;a--)
{
if(v[a].l>=mid)
{
cost+=v[a].l;
ant++;
}
else
{
if(ant<ans&&v[a].r>=mid)
{
cost+=mid;
ant++;
}
else
{
cost+=v[a].l;
}
}
}
if(cost<=m&&ant>=ans)
{
return true;
}
return false;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
for(int o=1;o<=t;o++)
{
cin>>n>>m;
for(int a=0;a<n;a++)
{
cin>>v[a].l>>v[a].r;
}
sort(v,v+n,cmp);
ll l=1,r=m,mid;
while(l<=r)
{
mid=(l+r)/2;
if(st(mid,n,m))
{
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<r<<endl;
}
return 0;
}
5.Educational Codeforces Round 75 (Rated for Div. 2) F
题意:给定k个红木板的长度和n个百木板子的长度,在给出q个周长,用这些木板拼栅栏,每个栅栏有且只有一个红木板和任意个白木板(可以没有),求用这些木板能够拼出每个周长栅栏的种数。
6.Educational Codeforces Round 75 (Rated for Div. 2) B
题意:给定n个零一串,可以任意调换任意串中的任意数,求能够组成最多的回文串个数。
做题时想复杂了,其实多种情况合在一起就不会有纰漏了。只看奇数长度的串和所有串的0和1个数即可。
#include<iostream>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<ostream>
#include<istream>
typedef long long ll;
using namespace std;
#define mod 1e9+7
#define PI acos(-1.0)
const int maxn=2*1e5;
const int mx=(1<<20)+99;
int n,m,maxx,ans,aans,flag,num1,num0;
string s;
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
for(int o=1;o<=t;o++)
{
num0=num1=flag=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s;
int len=s.size();
if(len%2) flag=1;
for(int j=0;j<len;j++)
if(s[j]-'0') num1++; else num0++;
}
if(num0%2&&num1%2&&!flag) n--;
cout<<n<<endl;
}
return 0;
}
7.Educational Codeforces Round 75 (Rated for Div. 2) E2
题意:有n个人投票。对于第i个人如果有其它mi个人投票给你,那么他也会投票给你,不然你就得给他pi的钱才投给你。求怎样花钱少,输出钱数。
E1,E2区别就在于人数多了三位数,cf上的标签提示了算法,也看了官方题解,但是,即使在理解了人家的算法然后想用自己的程序实现也还是写不ac。不过搜到别人的题解有个E1,E2都通用的,觉得挺好,是用的贪心。
#include<stdio.h>
#include<vector>
#include<queue>
#include<algorithm>
#define it register int
#define il inline
using namespace std;
const int N=1000005;
int T,n;
vector<int> g[N];
long long ans;
il void fr(int &num){
num=0;char c=getchar();int p=1;
while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
num*=p;
}
priority_queue<int,vector<int>,greater<int> > q;
int main(){
fr(T);
while(T--){
fr(n),ans=0;
for(it i=1,x,y;i<=n;++i) fr(x),fr(y),g[x].push_back(y);//收买i要x人或者花y元
for(it i=n-1;i>=0;--i){//注意到一个显而易见的事实就是人数不会超过n
for(it j=0,sz=g[i].size();j<sz;++j) q.push(g[i][j]);
while(q.size()>n-i) ans+=q.top(),q.pop();//选前n-i小的人进行收买
}
printf("%I64d\n",ans);
for(it i=0;i<n;++i) g[i].clear();while(!q.empty()) q.pop();//多测不清空 爆零两行泪
}
return 0;
}
-
总结:做题时做晚了,我记得当时认真听了,不记得老师说可以自己加加数字就可以找到下一次的训练题目,问了很多人没人回我,直到一个多小时后才有人告诉我。。。所以看题也急做题也急,拿题就做也做不好。今天训练效果在我这算是大打折扣了。