T1 模拟
题意梗概:给出四个方向的旋转轮子,输入一个初始状态/结束状态,和一个旋转次数n。问是顺时针转出来的还是逆时针转出来的,如果两者都可以输出 undefined
纯模拟没什么好思考的.
#include <cstdio> #include <cstring> #include <string> #include <iostream> using namespace std; char s[20]; int n,start,end; int main(){ s[0]=getchar(); getchar(); s[1]=getchar(); if(s[0]==118){ start = 1; } else if(s[0]==60){ start = 2; } else if(s[0]==94){ start = 3; } else{ start = 4; } // cout<<s[1]<<endl; if(s[1]==118){ end = 1; } else if(s[1]==60){ end = 2; } else if(s[1]==94){ end = 3; } else{ end = 4; } cin>>n; n%=4; //cout<<start<<" "<<end<<endl; if((start+n-1)%4+1 == end && (start+3-n)%4+1 == end){ cout<<"undefined"<<endl; } else if( (start+n-1)%4+1 == end){ cout<<"cw"<<endl; } else{ cout<<"ccw"<<endl; } return 0; }
T2 模拟
题意梗概:给出n个入口,以及k个守卫。每个守卫只能守一个门口,在这个门口如果还有客人的要来的情况下不能离开这个门口。
输入进入入口的顺序,问k个是否可以够用。
一道比较水的模拟题目,具体看代码注释。
#include <cstdio> #include <cstring> int n,k,vis[233],a[1000005],NEW[233],tot,used; char s[1000005]; int main(){ scanf("%d%d",&n,&k); //如果门卫比要来的人还多 那么一定可以的 if(k>=n) { printf("NO\n"); return 0; } scanf("%s",s); for(int i=0;i<n;i++){ int now = s[i]-'A'; //vis表示当前入口要来的人数 //a将字母储存为数字 vis[now]++; a[i] = now; } //tot表示当前需要的门卫数量 for(int i=0;i<n;i++){ vis[a[i]]--; //如果这个入口没人守,那么需要派遣一个人去守护。 if(NEW[a[i]]==0) NEW[a[i]]=1,tot++; //先后顺序很重要 这里WA了两次 //如果需要的人数大于k 那么一定是守不住的 if(tot>k) { printf("YES\n"); return 0; } //当前入口没人了 就不用守护了 if(vis[a[i]]==0) tot--; } printf("NO\n"); return 0; }
T3 二分
题目梗概: 两个人喊出两个数字,以喊的快的人的数字K,把快的人会乘上K^2,慢的人乘上K,给出n对数。问是否可以通过这个游戏来完成
思考: 一开始认为是质因数分解,后来想了想复杂度不对 $n (\sqrt{a}+\sqrt{b})$ 不出意外会TLE。于是乎,到最后也没有想出来解法。(虽然想到了二分,但是不知道怎么二分答案)
不得不说,这个二分还是很妙的,让我大开眼界。
设$a = x^{2}y $ $b = xy^{2}$
那么$ab=\left ( xy \right )^{3}$
设$xy=p$
我们二分枚举p的取值
之后p还必须满足$\frac{a}{p} = x$ $\frac{b}{p} = y$
代码实现:
#include <bits/stdc++.h> typedef long long ll; const int Maxn=1e6+5; ll check(ll x){ ll l = 0,r=Maxn; ll m; while(l<r){ m = (l+r+1)/2; //printf("l:%I64d r:%I64d m:%I64d\n",l,r,m); if(m*m*m>x) r = m - 1; else l = m ; } return l; } int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ ll a,b; scanf("%I64d%I64d",&a,&b); ll x = check(a*b); if(x*x*x != a*b) printf("No\n"); else if(a%x==0 && b%x==0) printf("Yes\n"); else printf("No\n"); } return 0; }
T4DP+线段树 (目前水平有限不会写)
所以这个坑等之后来填=。=