Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)ABCD總結
阿新 • • 發佈:2018-11-11
這場比賽發揮比較穩,在比賽開始45分鐘後 ABCD全是1A,並且最終過了終測。rating還沒出來,終測完rank146,希望能多上一點分吧。(這次程式碼放後面)E題互動題,依然不會做,待補。
A:給你三根木棒的長度,問你至少增加(任意一根木棒)多長長度才能使這三根木棒能夠成三角形。簽到題,排序後答案就是
max(0,c-b-a+1)。
B:給你a(0<=a<2e30) 求滿足a−(a⊕x)−x=0的x有多少個。打表很容易發現答案就是2的(a的二進位制中1的數量)次方。
C:給一個長度為n的字串,你把這些字串中的字元重新排序,使得排序後串的本質不同迴文串數量最多。之前做過一道構造題,自己在紙上畫畫也不難發現,只需要對每一個字元相同的連起來就可以了。
(補:長度為n的字串的本質不同迴文串數量最多為n。最少要看串中有幾個字母。)
D:這題可謂終測掛了一大片,就是給你一個n*m的地圖,'*'表示牆,不能走,'.'表示空地,可以走。給你你的起點座標(nn,mm),你可以上下左右移動,每次移動一個單位,但是你左往左移動的次數不超過x,往右移動的次數不超過y。問你有多少格子是你能到達的。
其實不難發現到達一個格子所消耗的往左、往右步數的最小值是唯一的。所以只需要記錄到達這個點往左往右的最小步數即可。如果有更小的方案才加入佇列。我的程式碼跑了186ms,還是比較快的。
放上一張D題終測的截圖:(侵刪)
真是壯觀!
程式碼:
A:
#include<bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f using namespace std; const int maxn=200010; int n,m,k; int a[maxn],sum[maxn]; int c[maxn]; int ans,ct,cnt,tmp,flag; char s[maxn]; int main() { int T,cas=1; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { if(n+m>k&&n+k>m&&m+k>n) ans=0; else { ans=min(abs(k-(n+m)+1),abs(n-(k+m)+1)); ans=min(ans,abs(m-(n+k)+1)); } printf("%d\n",ans); // if(flag) puts("Yes"); else puts("No"); } return 0; }
B:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
int n,m,k;
int a[maxn],sum[maxn];
int c[maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn];
int fcount(int x) //求數x二進位制下所含1的個數
{
int s=0;
while(x){
s++;
x&=(x-1);
}
return s;
}
int main()
{
int T,cas=1;
n=20;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ll ii=pow(2,fcount(n));
cout<<ii<<endl;
//printf("%d\n",ans);
// if(flag) puts("Yes"); else puts("No");
}
return 0;
}
C:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
int n,m,k;
int a[maxn],sum[maxn];
int c[maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn];
int main()
{
int T,cas=1;
scanf("%d",&n);
scanf("%s",s);
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
{
c[s[i]-'a']++;
}
for(int i=0;i<26;i++)
{
while(c[i]--)
{
char ch=i+'a';
cout<<ch;
}
}
cout<<endl;
//printf("%d\n",ans);
// if(flag) puts("Yes"); else puts("No");
return 0;
}
D:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2010;
int n,m,k,nn,mm;
int a[maxn],sum[maxn];
int c[maxn][maxn],cc[maxn][maxn];
int ans,ct,cnt,tmp,flag;
char s[maxn][maxn];
int X,Y;
struct node
{
int x,y;
int zuo,you;
node(){zuo=0;you=0;}
node(int a,int b){x=a;y=b;zuo=0;you=0;}
};
int dxy[]={1,0,-1,0,0,1,0,-1};
bool jud(int x,int y)
{
if(x<0||x>=n||y<0||y>=m) return 0;
return 1;
}
void bfs(int ii,int jj)
{
ans=0;
memset(c,-1,sizeof(c));
memset(cc,-1,sizeof(cc));
queue<node>q;
q.push(node(ii,jj));
c[ii][jj]=cc[ii][jj]=0;ans++;
while(!q.empty())
{
node kk,k=q.front();
q.pop();
for(int i=0;i<4;i++)
{
kk=k;
int x=k.x+dxy[i],y=k.y+dxy[i+4];
if(!jud(x,y)) continue;
if(s[x][y]=='*') continue;
if(i==1) kk.you=k.you+1;
if(kk.you>Y) continue;
if(i==3) kk.zuo=k.zuo+1;
if(kk.zuo>X) continue;
if(c[x][y]!=-1&&cc[x][y]!=-1&&c[x][y]<=kk.zuo&&cc[x][y]<=kk.you)
continue;
if(c[x][y]==-1||cc[x][y]==-1) ans++;
//cout<<x<<" "<<y<<endl;
if(c[x][y]==-1||c[x][y]>kk.zuo)
c[x][y]=kk.zuo;
if(cc[x][y]==-1||cc[x][y]>kk.you)
cc[x][y]=kk.you;
kk.x=x;kk.y=y;
q.push(kk);
}
}
printf("%d\n",ans);
}
int main()
{
int T,cas=1;
scanf("%d%d",&n,&m);
scanf("%d%d",&nn,&mm);
scanf("%d%d",&X,&Y);
for(int i=0;i<n;i++)scanf("%s",s[i]);
bfs(nn-1,mm-1);
//printf("%d\n",ans);
// if(flag) puts("Yes"); else puts("No");
return 0;
}