題目鏈接:CF423
感覺自己寫了4個模擬。==
A題
坑點:要注意一個組只有一個人的時候,他的入座順序,是優先選擇單桌,然後兩人空桌,然後兩人桌其中有一個位置被佔的桌子。讀了好幾遍都理解錯了。
然後對一人組和兩人組分別討論,兩人組很簡單,只坐空兩人桌。一人組就按照上面的順序寫就好,用兩個指針,指向桌子,這就不會超時。
AC代碼:
/*2017年11月23日09點27分
AC*/
#include<stdio.h>
#include<string.h>
const int maxn=2e5+10;
int t[maxn];
int bs[maxn];
int main(){
int n,a,b;
int pos1=0,pos2=0,lp2=0;
scanf("%d%d%d",&n,&a,&b);
for(int i=0;i<n;i++){
scanf("%d",&t[i]);
}
memset(bs,0,sizeof(bs));
int ans=0;
for(int k=0;k<n;k++){
if(t[k]==1){
bool fs=false;
if(a>=1){
a--;
fs=1;
}else{
//pos2=pos1;
// bool fs=false;
while(bs[pos2]!=0&&pos2<b){
pos2++;
}
if(pos2<b){
bs[pos2]=1;
//printf("%d\n",pos2);
fs=1;
}else{
while(bs[pos1]!=1&&pos1<b){
pos1++;
}
// printf("%d\n",pos1);
if(pos1<b){
bs[pos1]=2;
// printf("%d\n",pos1);
fs=1;
}
}
}
if(!fs) ans++;//printf("*%d\n",k);
}else if(t[k]==2){
bool fs=false;
while(bs[lp2]!=0&&lp2<b){
lp2++;
}
if(lp2<b){
bs[lp2]=2;
fs=1;
}
if(!fs) ans+=2;//printf("*%d\n",k);
}
}
printf("%d\n",ans);
return 0;
}
B 題:
坑點:注意輸出-1的情況有哪些。以及有解的情況有哪些。找一下四個邊界。
AC代碼:
/*2017年11月21日
19點25分
AC*/
#include<stdio.h>
const int maxn=110;
char mp[maxn][maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",mp[i]+1);
}
int numb=0,numw=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]=='B') numb++;
else numw++;
}
}
// printf("%d %d\n",numb,numw);
if(numb==0){
printf("1\n");
}else if(numw==0&&n!=m){
printf("-1\n");
}else if(numw==0&&n==m){
printf("0\n");
}
else{
int ox=110,bx=-1,ly=110,ry=-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]=='B'){
if(i<ox) ox=i;
if(i>bx) bx=i;
if(j<ly) ly=j;
if(j>ry) ry=j;
}
}
}
int need=0;
for(int i=ox;i<=bx;i++){
for(int j=ly;j<=ry;j++){
if(mp[i][j]=='W') need++;
}
}
//printf("%d\n",need);
//printf("%d %d %d %d \n",ly,ry,ox,bx);
int len=bx-ox+1,wid=ry-ly+1;
// printf("%d %d\n",len,wid);
if((len)==(wid)) printf("%d\n",need);
else{
if(len<wid){
int delta=wid-len;
if(ox-delta<1&&bx+delta>n&&(len+delta)>n) printf("-1\n");
else printf("%d\n",need+(delta*wid));
}
else{
int delta=len-wid;
if(ly-delta<1&&ry+delta>m&&(wid+delta)>m) printf("-1\n");
else printf("%d\n",need+(delta*len));
// printf("%d\n",delta);
}
}
}
return 0;
}
C題:
代碼參考別人的。自己寫的MLE 了,注意最長字符串長度2e6.也是一個模擬。注意重合的情況要從哪一位開始複製。
AC代碼:
#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=2e6+10;
int main(){
int n;
scanf("%d",&n);
char a[maxn]={};
for(int i=0;i<n;i++){
string s;
int k;
cin>>s>>k;
int len=s.length();
int pos1,pos2=-len;
for(int j=0;j<k;j++){
scanf("%d",&pos1);
for(int i=max(0,pos2+len-pos1);i<len;i++){
a[i+pos1]=s[i];
}
pos2=pos1;
}
}
int i,j;
for(i=maxn-1;a[i];i--);
for(j=i;!a[j];j--);
for(int k=1;k<=j;k++){
if(!a[k]) a[k]='a';
//printf("a");
#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int main(){
int n,k;
scanf("%d%d",&n,&k);
if(k==2){
printf("%d\n",n-1);
for(int i=1;i<=n-1;i++){
printf("%d %d\n",i,i+1);
}
}else if(k==n-1){
printf("2\n");
for(int i=1;i<n;i++){
printf("1 %d\n",i+1);
}
}else{
//cout<<"**"<<endl;
int nn=n-1;
int kn=nn/k;
int pn=nn%k;
int ckn=kn;
//printf("%d %d %d\n",kn,pn,pn+kn);
if(pn==0){
printf("%d\n",kn*2);
}
else if(pn==1){
printf("%d\n",kn*2+1);
}
else if(pn>1){
printf("%d\n",(kn+1)*2);
}
int id=2;
for(int i=1;i<=k;i++){
if(pn>0){
pn--;
int pre=1;
//(kn+pn)
for(int j=1;j<=ckn+1;j++){
printf("%d %d\n",pre,id);
pre=id;
id++;
}
}else{
int pre=1;
for(int j=1;j<=kn;j++){
printf("%d %d\n",pre,id);
pre=id;
id++;
}
}
}
}
return 0;
}
// else printf("%c",a[k]); // putchar(a[k]?a[k]:'a'); } printf("%s\n",a+1);return 0;}
D題:
K個葉子節點=度爲1的節點。
然後畫圖找規律。
思路參考:http://blog.csdn.net/a912952381/article/details/75041963
然後我自己花了幾個,推了一下規律,還真過了哈哈……
AC代碼: