目录
18104 练习使用多case解题
前置知识:
1.两数最小公倍数=两数之积/两数最大公约数
2.辗转相除法求两数的最大公约数
#include<iostream>
using namespace std;
using ll =long long;
ll gy(ll a,ll b){
ll r;
while((r=a%b)!=0){
a=b;
b=r;
}
return b;
}
ll gb(ll a,ll b){
return a*b/gy(a,b);
}
int main(){
int t;cin>>t;
ll a,b;
while(t--){
cin>>a>>b;
cout<<gb(a,b)<<endl;
}
cout<<"group 1 done"<<endl;
cin>>a>>b;
while(a+b!=0){
cout<<gb(a,b)<<endl;
cin>>a>>b;
}
cout<<"group 2 done"<<endl;
while(cin>>a>>b){
cout<<gb(a,b)<<endl;
}
cout<<"group 3 done"<<endl;
return 0;
}
19634 有序数组元素安插
前置知识:
了解multiset的运用
#include <iostream>
#include <set>
using namespace std;
int main(){
int n,x;cin>>n;
multiset <int> q;
for(int i=1;i<=n;i++){
cin>>x;
q.insert(x);
}
int m;cin>>m;
for(int i=1;i<=m;i++){
cin>>x;
q.insert(x);
auto it=q.begin();
for(int j=1;j<q.size()/2;j++) it++;
if(q.size()%2){
it++;cout<<*it<<endl;
}
else{
int s=0;
s=*it;it++;s+=*it;
cout<<s/2.0<<endl;
}
}
return 0;
}
19116 丑数
前置知识:
1.vector的运用
2.min()的运用
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> cs;
void create_cs(){
cs.push_back(1);
int p2=0,p3=0,p5=0;
while(cs.size()<100000){
int n2=cs[p2]*2;
int n3=cs[p3]*3;
int n5=cs[p5]*5;
int n=min(n2,min(n3,n5));
cs.push_back(n);
if(n==n2) p2++;
if(n==n3) p3++;
if(n==n5) p5++;
}
}
int main(){
create_cs();
int t;cin>>t;
while(t--){
int n;cin>>n;
cout<<cs[n-1]<<endl;
}
return 0;
}
18118 勇者斗恶龙
前置知识:
sort的运用
#include<iostream>
#include<algorithm>
using namespace std;
int el[200005],qs[200005];
int main(){
int n,m;cin>>n>>m;
while(n+m!=0){
for(int i=1;i<=n;i++) cin>>el[i];
for(int i=1;i<=m;i++) cin>>qs[i];
sort(el+1,el+1+n);sort(qs+1,qs+1+m);
if(n>m) cout<<"Loowater is doomed!"<<endl;
else{
int money=0,i,q=1;
for(i=1;i<=n;i++){
while(q<=m){
if(qs[q]<el[i]) q++;
else break;
}
if(q==m+1) break;
else{
money+=qs[q];q++;
}
}
if(i!=n+1) cout<<"Loowater is doomed!"<<endl;
else cout<<money<<endl;
}
cin>>n>>m;
}
return 0;
}
18107 校赛排名
前置知识:
1.sort的运用
2.结构体的运用
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
struct xuanshou{
int ct;int time;string name;int sx;
}xs[500005];
int cmp(xuanshou &a,xuanshou &b){
if(a.ct!=b.ct){
return a.ct>b.ct;
}
else if(a.time!=b.time){
return a.time<b.time;
}
else return a.sx<b.sx;
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>xs[i].ct>>xs[i].time>>xs[i].name;
xs[i].sx=i;
}
sort(xs+1,xs+1+n,cmp);
for(int i=1;i<=n;i++){
cout<<xs[i].name<<endl;
}
return 0;
}
19618 [填空]简单迷宫
前置知识:
1.bfs
2.queue的运用
LOC now=q.front();
q.pop();
if(now.c==dc&&now.r==dr){
printf("%d\n",now.s);
return;
}
for(int i=0;i<4;i++){
LOC new1={now.r+dir[i][0],now.c+dir[i][1],now.s+1};
if(new1.r>=0&&new1.r<m&&new1.c>=0&&new1.c<n&&d[new1.r][new1.c]=='0'){
q.push(new1);
d[new1.r][new1.c]='1';
}
}
1142 巡逻的士兵
#include<iostream>
using namespace std;
int xl(int n){
if(n==3) return 1;
if(n<3) return 0;
if(n%2) return xl(n/2)+xl(n/2+1);
else return 2*xl(n/2);
}
int main(){
int n;cin>>n;
while(n){
cout<<xl(n)<<endl;
cin>>n;
}
return 0;
}
18441 不巡逻的士兵
#include<iostream>
using namespace std;
int xl(int n){
if(n==3) return 0;
if(n<3) return n;
if(n%2) return xl(n/2)+xl(n/2+1);
else return 2*xl(n/2);
}
int main(){
int n;cin>>n;
while(n){
cout<<xl(n)<<endl;
cin>>n;
}
return 0;
}
18442 不被选中巡逻的士兵最小编号
#include<iostream>
#include<algorithm>
using namespace std;
int xl(int x,int s,int n){
if(n==3) return 100001;
if(n<3) return x;
if(n%2) return min(xl(x+s,s*2,n/2),xl(x,s*2,n/2+1));
else return min(xl(x,s*2,n/2),xl(x+s,s*2,n/2));
}
int main(){
int n;cin>>n;
while(n){
if(xl(1,1,n)==100001) cout<<0<<endl;
else cout<<xl(1,1,n)<<endl;
cin>>n;
}
return 0;
}
19144 判断士兵是否会被选中巡逻
#include<iostream>
using namespace std;
int xl(int x,int n){
if(n==3) return 1;
if(n<3) return 0;
if(x%2) return xl((x+1)/2,(n+1)/2);
else return xl(x/2,n/2);
}
int main(){
int n,x;cin>>n>>x;
while(n+x!=0){
if(xl(x,n)) cout<<"Y"<<endl;
else cout<<"N"<<endl;
cin>>n>>x;
}
return 0;
}
18699 [填空]归并排序
int m=(x+y)/2;
merge_sort(A,x,m,T);
merge_sort(A,m,y,T);
19639 [填空]最大子数组和问
int mid=(low+high)/2;
int leftMax=maxSubArraySum(arr,low,mid);
int rightMax=maxSubArraySum(arr,mid+1,high);
int crossMax=maxCrossingSum(arr,low,mid,high);
18443 除法等式
19648 分数拆分
#include<iostream>
#include<cstdio>
using namespace std;
using ll=long long;
int main(){
ll n;cin>>n;
ll k=2*n;
for(int i=n+1;i<=k;i++){
if((i*n)%(i-n)==0){
printf("1/%lld=1/%lld+1/%lld\n",n,(i*n)/(i-n),i);
}
}
return 0;
}
8623 龙龙
#include<iostream>
#include<math.h>
using namespace std;
long long H(int n){
long long res = 0;
int k=sqrt(n);
for(int i=1;i<k;i++){
res+=(n/(i)-n/(i+1))*i;
}
for(int i=1;i<=n/k;i++){
res+=n/i;
}
return res;
}
int main(){
int t;cin>>t;
while(t--){
int n;cin>>n;
cout<<H(n)<<endl;
}
return 0;
}
19412 N个不同整数全排列
#include<iostream>
#include<algorithm>
using namespace std;
int a[10];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
do{
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
}while(next_permutation(a+1,a+1+n));
return 0;
}
19650 有重复无素排列问题
#include<iostream>
#include<algorithm>
using namespace std;
int a[10];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
do{
int flag=1;
for(int i=1;i<=n;i++){
if(a[i-1]%2&&a[i]%2){
flag=0;break;
}
}
if(flag){
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
}
}while(next_permutation(a+1,a+1+n));
return 0;
}
18124 N皇后问题
#include<iostream>
#include<cstring>
using namespace std;
int n,ct;
int l[15],d1[31],d2[31];
void dfs(int cur){
if(cur==n+1){
ct++;return;
}
for(int i=1;i<=n;i++){
if(!l[i]&&!d1[i+cur]&&!d2[i-cur+n]){
l[i]=d1[i+cur]=d2[i-cur+n]=1;
dfs(cur+1);
l[i]=d1[i+cur]=d2[i-cur+n]=0;
}
}
}
int main(){
int t;cin>>t;
while(t--){
cin>>n;ct=0;
memset(l,0,sizeof(l));
memset(d1,0,sizeof(d1));
memset(d2,0,sizeof(d2));
dfs(1);
cout<<ct<<endl;
}
return 0;
}
最小特殊数字
#include<iostream>
#include<algorithm>
using namespace std;
using ll=long long;
int a[10],n,flag=0;
ll minn=100000000000,k;
void dfs(int cur,ll ans){
if(flag) return;
if(cur==n+1&&ans%k==0){
flag=1;
minn=min(minn,ans);
return;
}
int i;
if(ans==0&&cur!=n) i=1;else i=0;
for(;i<10;i++){
if(a[i]){
a[i]--;
ans=ans*10+i;
dfs(cur+1,ans);
if(flag) return;
ans=(ans-i)/10;
a[i]++;
}
}
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
int x;cin>>x;a[x]++;
}
dfs(1,0);
if(flag) cout<<minn;
else cout<<-1;
return 0;
}
01背包问题
#include<iostream>
#include<algorithm>
using namespace std;
int w[31],v[31];
int dp[201];
int main(){
int n,m;
cin>>m>>n;
for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
dp[j]=max(dp[j-w[i]]+v[i],dp[j]);
}
}
cout<<dp[m];
return 0;
}
最长公共子序列
#include<iostream>
#include<string>
using namespace std;
int dp[1005][1005];
int main(){
string a,b;cin>>a>>b;
int la=a.length();int lb=b.length();
for(int i=0;i<la;i++){
for(int j=0;j<lb;j++){
if(a[i]==b[j]) dp[i+1][j+1]=dp[i][j]+1;
else{
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
}
}
}
cout<<dp[la][lb];
return 0;
}