A.2176
给一个字符串s,问距离为D的字母对是否存在相同。
模拟
#include<bits/stdc++.h> using namespace std; int main() { string s,b; while(cin>>s) { if(s[0]==‘*‘)break; int flag=1; map<string,int>ma; for(int jump=1;jump<s.size();jump++) { ma.clear(); for(int L=0;L+jump<s.size();L++) { b.clear(); b+=s[L]; b+=s[L+jump]; if(ma[b]==0)ma[b]=1; else { flag=0; break; } } if(flag==0)break; } if(flag)cout<<s<<" is surprising.\n"; else cout<<s<<" is NOT surprising.\n"; } return 0; }
A.cpp
B.4694
给两堆糖果,每次从多的那堆拿gcd(a,b)个糖果,lemon先拿,问最后俩人糖果数。
模拟
#include<bits/stdc++.h> using namespace std; int main() { int a,b; while(cin>>a>>b,a||b) { int le=0,yu=0,sum=1; while(a||b) { if(sum%2)le+=__gcd(a,b); else yu+=__gcd(a,b); if(a>b)a-=__gcd(a,b); else b-=__gcd(a,b); sum++; if(a==0||b==0) { if(sum%2)le+=a+b; else yu+=a+b; break; } } cout<<le<<" "<<yu<<endl; } return 0; }
B.cpp
C.5259
给若干多项式和一个x,问多项式值最大和按值分组输出相同值最多的个数。
模拟
#include <bits/stdc++.h> #define ll long long using namespace std; ll mul(ll a, ll b,int x) { if(b == 0) return a; while(b--) a*= x; return a; } int main() { int t; cin >> t; while(t--) { map<ll,int> mp; ll n, x; cin >> n >> x; int maxx = -1; while(n--) { ll k,sum = 0; cin >> k; while(k--) { ll a, b; cin >> a >> b; sum += mul(a,b,x); } mp[sum]++; maxx = max(maxx,mp[sum]); } map<ll,int>::reverse_iterator it=mp.rbegin(); cout << it->first << " " << maxx << endl; } return 0; }
C.cpp
D.5265
给一个围棋谱,问黑棋还需要下在哪才能全围住白棋。
广搜
#include<bits/stdc++.h> using namespace std; char a[25][25]; int dtx[4]={0,0,1,-1}; int dty[4]={1,-1,0,0}; int check(int i,int j) { for(int z=0;z<4;z++) { int I=i+dtx[z],J=j+dty[z]; if(I>=0&&I<19&&J>=0&&J<19) { if(a[I][J]==‘W‘) return 1; } } return 0; } int main() { while(gets(a[0])!=NULL) { for(int i=1;i<19;i++) gets(a[i]); int sum=0; for(int i=0;i<19;i++) for(int j=0;j<19;j++) { if(a[i][j]==‘.‘) if(check(i,j)) cout<<i+1<<" "<<j+1<<endl,sum++; } if(sum==0)cout<<"YuYu Wins!\n"; } return 0; }
D.cpp
E.5260
给一个1-n的序列,问全排列连接起来第x个数字是几。
模拟
#include <bits/stdc++.h> using namespace std; int s[1000000]; int main() { int n,x,a[7],b[7],i,z,s1,flag,s2,k; while(~scanf("%d%d",&n,&x)) { s1=n;flag=0;s2=0;k=0; for(i=1;i<=n;i++) { scanf("%d",&z); a[i]=b[i]=z; } sort(a+1,a+n+1); for(i=2;i<=n;i++) s1*=i; sort(a,a+n); do { for(i=1;i<=n;i++) { if(a[i]!=b[i]) break; } if(i>n) flag=1; if(!flag) s2++; for(i=1;i<=n;i++) s[k++]=a[i]; }while(next_permutation(a+1,a+n+1)); x+=s2*n; x%=s1; if(x!=0) x--; printf("%d\n",s[x]); } return 0; }
E.cpp
F.4702
给币值为1,3,5,7,9,13的硬币的个数和糖果的价格g,问最少需要多少枚硬币组成g。
背包
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; int dp[5001]; const int LIM=1e9; int main() { int w[6]={1,3,5,7,9,13}; int v[6]; int t=0,g; while(t!=7) { int ans=0; t=0; for(int i=0;i<6;i++) { cin>>v[i]; if(v[i]==0)t++; } cin>>g; if(g==0) if(t==6) break; for(int i=1;i<=g;i++) dp[i]=LIM; for(int i=0;i<6;i++) for(int j=1;j<=v[i];j++) for(int k=g;k>=w[i];k--) dp[k]=min(dp[k-w[i]]+1,dp[k]); if(dp[g]==LIM)cout<<"impossible"<<endl; else cout<<dp[g]<<endl; } return 0; }
F.cpp
G.3331
给一个2n*2n的网格图,以中心为原点画一个直径为2n-1的圆,问圆周线穿过了多少个格子。
思维
#include<bits/stdc++.h> using namespace std; int arr[1005]; int main() { int n; arr[1]=4; for(int i=2;i<=1004;i++){ arr[i]=arr[i-1]+8; } while(cin>>n&&n!=0){ cout << arr[n] <<endl; } return 0; }
G.cpp
H.4671
给n个数,求前M大并按小到大输出。
只需要记录前M个。
#include<bits/stdc++.h> using namespace std; int get() { int r=0; char c; while(c=getchar(),!(c>=‘0‘&&c<=‘9‘)); r = c-‘0‘; while(c=getchar(),c>=‘0‘&&c<=‘9‘) r = (r*10)+c-‘0‘; return r; } int main() { int n,m,x,b[11],len=0; n=get(); m=get(); for(int i=1;i<=n;i++) { x=get(); if(len<m)b[len++]=x; else for(int j=0;j<m;j++) if(b[j]<x) swap(b[j],x); } sort(b,b+m); for(int i=0;i<m;i++) { if(i!=0)printf(" "); printf("%d",b[i]); } putchar(‘\n‘); return 0; }
H.cpp
I.4959
给n个数,问能否选若干数使和=k。
深搜
#include<bits/stdc++.h> using namespace std; int n,a[21],i,k; bool dfs(int i,int sum) { if(i==n) { if(sum==k)return 1; return 0; } if(dfs(i+1,sum))return 1; if(dfs(i+1,sum+a[i]))return 1; return 0; } int main() { while(cin>>n>>k) { for(i=0;i<n;i++)cin>>a[i]; if(dfs(0,0))printf("Yes\n"); else printf("No\n"); } return 0; }
I.cpp
J.4374
n个特工,密钥总量为k(编号为0到k-1),以及每个特工所带的m个密钥,求是否每3个特工的密钥都可以解密文件。
模拟
#include<bits/stdc++.h> using namespace std; int n,m,k; int check(int a[]) { for(int i=0;i<m;i++) if(a[i]==0) return 0; return 1; } int main() { while(cin>>n>>m>>k) { vector<int> v[10]; for(int i=0;i<n;i++) { int x; for(int j=0;j<k;j++) {cin>>x; v[i].push_back(x);} } int flag=1; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) {for(int z=j+1;z<n;z++) { int a[11]={0}; for(int t=0;t<k;t++) { a[v[i][t]]=1; a[v[j][t]]=1; a[v[z][t]]=1; } if(!check(a))flag=0; } } } if(flag)cout<<"YES\n"; else cout<<"NO\n"; } }
J.cpp
原文地址:https://www.cnblogs.com/taozi1115402474/p/10851209.html
时间: 2024-10-25 09:55:45