[分寝室] [c++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include<bits/stdc++.h> using namespace std; const int N=10000; int n0,n1,n; int a[N],b[N]; int main() { int a1=-1,b1=-1,m=100000; cin>>n0,n1,n; for(int i=1;i<=n-1;i++) { int j=n-i; if(a!=i && a%i=0 && b%j==0 && b!=j) { int aa=a/i,bb=b/j;res=abs(aa-bb); if(mn>res) a1=i,a2=j,m=res; } } if(a1==-1 && b1==-1) cout<<"NO Solution"; else cout<<a1<<" "<<b1; return 0; }
|
这道题很可惜 没想到用dfs 还是比赛状态问题
事实上是很简单的 一个飞机只要最早时间在lasttime及以后 如果最早时间刚好是lasttime 就立马降落
否则就它自己的最早时间降落
[飞机降落] [c++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include<bits/stdc++.h> using namespace std; int t; int n; const int N=10000; int a[N],b[N],c[N]; bool st[N]; bool flag;
void dfs(int u,int lasttime) { if(flag) return; if(u>n) { flag=true; return; } for(int i=1;i<=n;i++) { if(!st[i]) { if(a[i]+b[i]>=lasttime) { st[i]=true; if(a[i]>lasttime) dfs(u+1,a[i]+c[i]); else dfs(u+1,lasttime+c[i]); st[i]=false; } } } } int main() { cin>>t; while(t--) { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]>>b[i]>>c[i]; } memset(st,false,sizeof st); flag=false; dfs(1,0); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
|
s.substr(i,len) 从s的第i位开始截取长度为len的串
s.erase(i,n) 删除从pos开始的n个字符 比如erase(0,1) 就是删除第一个字符
s.find(s1,n) 在s中从下标n开始查找s1 返回找到的第一个下标
s.find(s1,n) 在s中从下标n开始查找s1 返回找到的第一个下标
s.rfind(s1,n) 在s中从下标n开始向前查找s1
没有的话均返回-1
[剪贴] [c++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include<bits/stdc++.h> using namespace std; const int N=10000; string s,ss; int n; int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>s; int cd=s.size(); cin>>n; while(n--) { int a,b; string str1,str2,str3,str4,str5; cin>>a>>b; a-=1; b-=1;//变成下标 cin>>str1>>str2; str3=s.substr(a,b-a+1); //剪贴板内容 s.erase(a,b-a+1); int x=s.find(str1+str2); if(x==-1) s+=str3; //没有加后面 else { str5=s.substr(x+str1.size()); s.erase(x+str1.size()); s=s+str3+str5; } } cout<<s; return 0; }
|
[藏宝图] [c++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m;
int cnt1=0; int cnt2=0; int dx[]={1,0,-1,0}; int dy[]={0,1,0,-1}; typedef pair<int,int> PII;
int main() { cin>>n>>m; int used[n][m]; int g[n][m]; memset(used,0,sizeof used); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%1d",&g[i][j]); } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(g[i][j]!=0 && used[i][j]==0) //如果是陆地或者宝藏且没标记过 { bool flag=0; //宝藏状态 used[i][j]=1; if(g[i][j]>=2)//有宝藏 { flag=1; } PII q[n*m]; q[0]={i,j}; int hh=0,tt=0; while(hh<=tt) { auto t=q[hh++]; for(int k=0;k<4;k++) { int a=t.first+dx[k]; int b=t.second+dy[k]; if(a<0 || a>=n || b<0 || b>=m || g[a][b]==0 || used[a][b]==1) continue; //越界 used[a][b]=1; if(g[a][b]>=2) flag=1; q[++tt]={a,b}; } } cnt1++; if(flag) cnt2++; } } } cout<<cnt1<<" "<<cnt2<<endl; return 0; }
|