比赛时间
2017 12 16 19:35-21:35。
结果
+133rating。
感想
这是第一次打cf,两个小时实际上因为回寝时间只打了一个半小时。
总共六道题写了五道,感觉还可以,英文直接看(借助有道词典)大多也能看懂。
最后+133rating还是挺高兴的,也没有被hack掉(当然也没时间hack别人)。
题解
A Rounding
一个简单的四舍五入,没啥好说。
#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
long long n;
int main(){
cin>>n;//不能%lld真的很奇怪?
if(n%10>=5)n=(n/10+1)*10;
else n=n/10*10;
cout<<n;
return 0;
}
B Proper Nutrition
一眼ex-gcd,两眼暴力加模拟。
#include<bits/stdc++.h>
using namespace std;
int n,a,b;
int read(){
int num=0;char c=getchar();
for(;c<'0'||c>'9';c=getchar());
for(;c>='0'&&c<='9';c=getchar()) num=(num<<3)+(num<<1)+c-48;
return num;
}
void end(){
printf("NO");
exit(0);
}
int main(){
n=read();a=read();b=read();
for(int i=0;;++i){
if(1LL*i*a>n)end();
if((n-i*a)%b==0){
printf("YES\n");
printf("%d %d\n",i,(n-i*a)/b);
exit(0);
}
}
return 0;
}
C Phone Numbers
绝妙的暴力+字符串处理。
#include<bits/stdc++.h>
using namespace std;
struct people{
int num;
string in,s[1000];
}p[25];
int n,cnt;
string s;
int read(){
int num=0;char c=getchar();
for(;c<'0'||c>'9';c=getchar());
for(;c>='0'&&c<='9';c=getchar()) num=(num<<3)+(num<<1)+c-48;
return num;
}
void init(){
n=read();
for(int i=1;i<=n;++i){
cin>>s;int j,t;
for(j=1;j<=cnt;++j) if(p[j].in==s)break;
p[j].in=s;
cnt=max(cnt,j);
t=read();
for(int k=1;k<=t;++k) cin>>p[j].s[p[j].num+k];
p[j].num+=t;
}
for(int i=1;i<=cnt;++i){
for(int j=1;j<=p[i].num;++j)
for(int k=1,flag=1;k<=p[i].num;++k){
int lena=p[i].s[j].length();
int lenb=p[i].s[k].length();
flag=1;
if(j==k) continue;
if(!lena||!lenb)continue;
if(lena<lenb) continue;
for(int o=1;o<=lenb;++o)
if(p[i].s[j][lena-lenb+o-1]!=p[i].s[k][o-1]){
flag=0;
break;
}
if(!flag)continue;
p[i].s[k]="";
}
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;++i){
cout<<p[i].in<<' ';
int temp=0;
for(int j=1;j<=p[i].num;++j)
if(p[i].s[j]!="")++temp;
printf("%d",temp);
for(int j=1;j<=p[i].num;++j)
if(p[i].s[j]!="")
cout<<' '<<p[i].s[j];
printf("\n");
}
}
int main(){
init();
return 0;
}
D Alarm Clock
贪心与查分思想的简单运用。
#include<bits/stdc++.h>
using namespace std;
int n,m,k,sum=0,ans,maxx,flag[1000010]={};
int read(){
int num=0;char c=getchar();
for(;c<'0'||c>'9';c=getchar());
for(;c>='0'&&c<='9';c=getchar()) num=(num<<3)+(num<<1)+c-48;
return num;
}
void work(){
n=read();m=read();k=read();
for(int i=1;i<=n;++i){
int x=read();
maxx=max(maxx,x);
flag[x]=1;
}
for(int i=1;i<=maxx;++i){
if(i>=m)sum-=flag[i-m];
sum+=flag[i];
if(sum>=k){
++ans;
--sum;
flag[i]=0;
}
}
printf("%d",ans);
}
int main(){
work();
return 0;
}
E Squares and not squares
计算两种情况的花费之后用了两个队列,每次取更小的队头。
#include<bits/stdc++.h>
using namespace std;
struct point{
int lo,hi,in;
int yes,no;
}a[200010];
int n,b[200010],c[200010];
long long ans=0;
int read(){
int num=0;char c=getchar();
for(;c<'0'||c>'9';c=getchar());
for(;c>='0'&&c<='9';c=getchar()) num=(num<<3)+(num<<1)+c-48;
return num;
}
void init(){
n=read();
for(int i=1;i<=n;++i){
a[i].in=read();
int lo=(int)sqrt(a[i].in);
int hi=lo+1;
a[i].lo=a[i].in-lo*lo;
a[i].hi=hi*hi-a[i].in;
a[i].yes=min(a[i].lo,a[i].hi);
if(a[i].lo&&a[i].hi)a[i].no=0;
else a[i].no=a[i].in?1:2;
}
}
void work(){
for(int i=1;i<=n;++i){
b[i]=a[i].yes;
c[i]=a[i].no;
}
sort(b+1,b+n+1);
sort(c+1,c+n+1);
int hb=1,hc=1;
while(hb<=n/2||hc<=n/2){
//printf("%d %d %d %d\n",hb,hc,b[hb],c[hc]);
if(hb>n/2){
ans+=c[hc];
++hc;
}else if(hc>n/2){
ans+=b[hb];
++hb;
}else if(b[hb]<c[hc]){
ans+=b[hb];
++hb;
}else{
ans+=c[hc];
++hc;
}
}
cout<<ans;
}
int main(){
init();
work();
return 0;
}
F Restoring the Expression
暂时还没有做过。