A下棋
找规律,没个人的每次操作都会改变(0,0)位置点的操作,即每个人要操作时(0,0)的状态对不同人来说都是不会变化的。如果(0,0)初始为白,则每次到M时都是黑,M不会输;相反,L不会输。
/*
* problem:下棋
* method:找规律
* date:2020/07/14
*/
#include<iostream>
#define LL long long
using namespace std;
const int N=505;
int n,m,T;
//char table[N][N];
int main() {
int i,j,num,flag=0;
char c;
cin>>T;
while(T--) {
flag=0;
cin>>n>>m;
for(i=0; i<n; i++) {
for(j=0; j<m; j++) {
cin>>c;
if(c=='B'&&!i&&!j) {
flag=1;
}
}
}
if(flag) cout<<"L"<<endl;
else cout<<"M"<<endl;
}
return 0;
}
B打赌
黑板上最小的数为gcd(a,b),黑板上所有可能出现的数为小于最大初始数的gcd(a,b)的倍数
/*
* problem:打赌
* method:gcd
* date:2020/07/14
*/
#include<iostream>
#define ll long long
using namespace std;
int x,y,z;
int gcd(int a,int b){
while(a%b){
int c=a%b;
a=b;
b=c;
}
return b;
}
int main(){
while(cin>>x>>y){
z=gcd(x,y);
x=x>y?x:y;
z=x/z-2;
if(z&1) cout<<"1"<<endl;
else cout<<"0"<<endl;
}
return 0;
}
C花生米
斐波那契数(Faboncci)
/*
* problem:花生米
* method:Fiboncci
* date:2020/07/14
*/
#include<iostream>
#define LL long long
using namespace std;
LL f[105],n,t;
void init(){
f[0]=0;
f[1]=1;
f[2]=2;
f[3]=4;
for(int i=4;i<105;i++)
f[i]=f[i-1]+f[i-2]+f[i-3];
}
int main(){
cin>>t;
init();
while(t--){
cin>>n;
cout<<f[n]<<endl;
}
return 0;
}
D简单粗暴串
串匹配(暴力法)
/*
* problem:简单粗暴串
* method:串匹配(暴力)
* date:2020/07/14
*/
#include<iostream>
#include<string>
#define ll long long
using namespace std;
const int maxn=1005;
string x,y;
int n;
int main(){
int i,j;
while(cin>>x){
if(x[0]=='#') break;
cin>>y;
n=0;
for(i=0,j=0;i<x.length();i++){
if(x[i]==y[j]){
while(i<x.length()&&j<y.length()&&x[i]==y[j]){
i++;j++;
}
}
if(j==y.length()) i--,n++;
else i-=j;
j=0;
}
cout<<n<<endl;
}
return 0;
}
E宝藏男孩
找规律、式子
/*
* problem:能量项链
* method:规律、string
* date:2020/07/14
*/
#include<iostream>
#include<string>
#define ll long long
using namespace std;
const int maxn=15;
int n,t,pos[maxn];
string s;
int main(){
int i,j,flag;
cin>>t;
while(t--){
cin>>s>>n;
for(i=0;i<n;i++){
flag=0;
for(string::iterator it=s.begin();it!=s.end();it++){
if((*it)<*(it+1)){
flag=1;
s.erase(it);
break;
}
}
if(!flag) s.pop_back();
}
cout<<s<<endl;
}
return 0;
}
F考试成绩
拓扑排序+优先队列
/*
* problem:考试成绩
* method:拓扑排序、优先队列
* date:2020/07/14
*/
#include<iostream>
#include<queue>
#include<vector>
#include<utility>
#define ll long long
using namespace std;
const int maxn=505;
typedef pair<int,int> P;
priority_queue<int,vector<int>,greater<int>> q;
vector<int> v[maxn],ans;
int in[maxn];
int n,m;
void init() {
int i,j;
for(i=1; i<=n; i++) {
while(!v[i].empty()) v[i].pop_back();
in[i]=0;
}
while(!ans.empty()) ans.pop_back();
while(!q.empty()) q.pop();
}
int main() {
int i,j,a,b;
while(cin>>n>>m) {
init();
for(i=0; i<m; i++) {
cin>>a>>b;
v[a].push_back(b);
in[b]++;
}
for(i=1; i<=n; i++) {
if(in[i]==0) {
q.push(i);
}
}
while(!q.empty()) {
int now=q.top();
q.pop();
ans.push_back(now);
for(i=0; i<v[now].size(); i++) {
in[v[now][i]]--;
if(in[v[now][i]]==0) q.push(v[now][i]);
}
}
for(i=0; i<ans.size(); i++) {
cout<<ans[i];
if(i!=ans.size()-1) cout<<' ';
}
cout<<endl;
}
return 0;
}
G相似
找规律
奇数(个奇数)+奇数(个偶数)=偶数->找到一个|x-y|=1可转变为下面
偶数(个奇数)+偶数(个偶数)=偶数->满足条件
/*
* problem:相似
* method:找规律
* date:2020/07/13
*/
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n,t,x[105];
int main() {
int i,j,num;
cin>>t;
while(t--) {
cin>>n;
num=0;
for(i=0; i<n; i++) {
cin>>x[i];
if(x[i]&1) num++;
}
if(!(num&1)) {
cout<<"YES"<<endl;
} else {
int flag=0;
sort(x,x+n);
for(i=0;i<n-1;i++){
if(x[i]+1==x[i+1]){
flag=1;
break;
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
H修建道路
最小生出树
kruskal算法+并查集
/*
* problem:修建道路
* method:kruskal、并查集
* date:2020/07/14
*/
#include<iostream>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
struct arc{
int u,v,c;
arc(){}
arc(int a,int b,int c):u(a),v(b),c(c){}
};
const int maxn=305;
int fa[maxn];
vector<arc> arcs;
int n,m;
int cmp(arc a,arc b){
return a.c<b.c;
}
int findFa(int n){
while(fa[n]!=n){
n=fa[n];
}
return n;
}
void merge(int a,int b){
fa[findFa(a)]=fa[b];
}
int kruskal(){
int max=10000,i,j,cnt=0;
for(i=0;i<n;i++){
fa[i]=i;
}
for(i=0;i<arcs.size();i++){
if(findFa(arcs[i].u)!=findFa(arcs[i].v)){
merge(arcs[i].u,arcs[i].v);
cnt++;
max=arcs[i].c;
}
if(cnt==n-1) break;
}
return max;
}
int main(){
int i,j,u,v,c;
cin>>n>>m;
for(i=0;i<m;i++){
cin>>u>>v>>c;
arcs.push_back(arc(u,v,c));
}
sort(arcs.begin(),arcs.end(),cmp);
int ans=kruskal();
cout<<n-1<<' '<<ans<<endl;
return 0;
}
I完美主义者
找技巧、一维动态规划
/*
* problem:完美主义者
* method:一维dp
* date:2020/07/14
*/
#include<iostream>
#include<vector>
#define ll long long
using namespace std;
const int maxn=105;
int x[maxn],dp1[maxn],dp2[maxn];
int n;
int main(){
cin>>n;
int i,j,t;
for(i=0;i<n;i++){
cin>>x[i];
dp1[i]=1;
dp2[i]=1;
}
for(i=1;i<n;i++){
for(j=0;j<i;j++){
if(x[j]<x[i]&&dp1[j]+1>dp1[i]){
dp1[i]=dp1[j]+1;
}
}
}
for(i=n-2;i>=0;i--){
for(j=i+1;j<n;j++){
if(x[j]<x[i]&&dp2[j]+1>dp2[i]){
dp2[i]=dp2[j]+1;
}
}
}
int max=0,ans;
for(i=0;i<n;i++){
ans=dp1[i]+dp2[i]-1;
max=max>ans?max:ans;
}
cout<<n-max<<endl;
return 0;
}
J能量项链
找规律
string
/*
* problem:能量项链
* method:规律、string
* date:2020/07/14
*/
#include<iostream>
#include<string>
#define ll long long
using namespace std;
const int maxn=15;
int n,t,pos[maxn];
string s;
int main(){
int i,j,flag;
cin>>t;
while(t--){
cin>>s>>n;
for(i=0;i<n;i++){
flag=0;
for(string::iterator it=s.begin();it!=s.end();it++){
if((*it)<*(it+1)){
flag=1;
s.erase(it);
break;
}
}
if(!flag) s.pop_back();
}
cout<<s<<endl;
}
return 0;
}