C.冶炼金属:
AC:
#include<iostream>
using namespace std;
const int N=1e4+5;
int n,a[N],b[N];
int main(){
cin>>n;
int maxx=1e9;
for(int i=0;i<n;i++){
cin>>a[i]>>b[i];
maxx=min(a[i]/b[i],maxx);
}
int minn=0;
for(int i=maxx;i>=1;i--){
for(int j=0;j<n;j++){
if(a[j]/i==b[j]+1){
minn=i+1;
cout<<minn<<" "<<maxx<<endl;
return 0;
}
}
}
return 0;
}
D.飞机降落:
AC:
#include<iostream>
using namespace std;
int T,n;
struct plane{
int t,d,l; //最早降落时刻,盘旋时间,降落时要的时间
}p[15];
bool flag[15],key;
void dfs(int cnt,int last){
//全部选中标记key并且返回
if(cnt==n){
key=true;
return;
}
for(int i=0;i<n;i++){ //从零开始遍历
if(!flag[i]&&p[i].t+p[i].d>=last){
//flag未被选中并且最早降落时刻加盘旋时间大于等于当前的最后时间才可以被降落
flag[i]=true;//标记
dfs(cnt+1,max(last,p[i].t)+p[i].l);//dfs(选中数加一,更新最后时间)
flag[i]=false;//回溯
}
}
}
int main(void){
cin>>T;
while(T--){
key=false;//每次要更新标记点key
cin>>n;
for(int i=0;i<n;i++) cin>>p[i].t>>p[i].d>>p[i].l;
//dfs(已经选择0个,当前的最后时间为0)
dfs(0,0);
//输出
if(key) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
E.接龙数列
AC:
#include<iostream>
#include<cstring>
using namespace std;
//dp[i]表示以i结尾的数列长度
int n,m,dp[10];
int main(){
cin>>n;
string s;
for(int i=0;i<n;++i){
cin>>s;
//begin表示开头数字,end表示结尾数字
int begin=s[0]-'0',end=s[s.size()-1]-'0';
dp[end]=max(dp[begin]+1,dp[end]);
m=max(m,dp[end]);
}
cout<<n-m<<endl;
return 0;
}
F.岛屿个数
AC:
#include<iostream>
using namespace std;
const int N=55;
int t,m,n;
char map[N][N];
int dx[8]={-1,0,1,0,-1,1,-1,1};
int dy[8]={0,1,0,-1,1,1,-1,-1};
void dfs0(int x,int y){
map[x][y]='*';
for(int i=0;i<8;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx>=0&&xx<=m+1&&yy>=0&&yy<=n+1&&map[xx][yy]=='0'){
dfs0(xx,yy);
}
}
}
void dfs(int x,int y){
if(x>=0&&x<=m+1&&y>=0&&y<=n+1&&map[x][y]=='1'){
map[x][y]=' ';
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
dfs(xx,yy);
}
}
}
int main(){
cin>>t;
while(t--){
int ans=0;
cin>>m>>n;
//填充外海
for(int i=0;i<=m+1;i++) map[0][i]='0',map[m+1][i]='0';
for(int i=1;i<=m;i++) map[i][0]='0',map[i][n+1]='0';
//输入
for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) cin>>map[i][j];
//先dfs外海(保证了等会dfs时不会存在子岛屿)
for(int i=0;i<=m+1;i++){
for(int j=0;j<=n+1;j++){
dfs0(0,0);
break;
}
}
//dfs岛屿
for(int i=0;i<=m+1;i++){
for(int j=0;j<=n+1;j++){
if(map[i][j]=='1'&&map[i-1][j]=='*'){
dfs(i,j);
ans++;
}
}
}
//输出
cout<<ans<<endl;
}
return 0;
}
G.子串简写
暴力枚举(90 points)
#include<iostream>
using namespace std;
const int N=5e5+5;
int k,a[N],b[N],ans,cnta,cntb;
string s;
char c1,c2;
int main(){
cin>>k;
cin>>s>>c1>>c2;
int n=s.size();
for(int i=0;i<n;i++){
if(s[i]==c1) a[cnta++]=i;
else if(s[i]==c2) b[cntb++]=i;
else continue;
}
int i=0,j=0;
for(i;i<cnta;i++){
for(j;j<cntb;j++){
if(b[j]-a[i]+1>=k){
ans+=cntb-j;
break;
}
}
}
cout<<ans<<endl;
return 0;
}
前缀和AC:
#include<iostream>
using namespace std;
int k;
string s;
char c1,c2;
long long ans=0,sum=0;
int main(){
cin>>k;
cin>>s>>c1>>c2;
int n=s.size();
for(int i=0,j=k-1;j<n;i++,j++){
if(s[i]==c1) sum++;
if(s[j]==c2) ans+=sum;
}
cout<<ans;
return 0;
}