- 题解
2023.02.19新生赛标程
- 2023-2-19 18:55:41 @
A.单词接龙
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, d[N], st[N];
vector<int> e[N];
void toposort() {
queue<int> q;
for (int i = 1; i <= n; i++) {
st[i] = -1;
if (!d[i]) {
st[i] = 0;
q.push(i);
}
}
while (!q.empty()) {
int x = q.front();
q.pop();
for (int y : e[x]) {
if (~st[y]) continue;
if (st[x] == 0) {
st[y] = 1;
q.push(y);
} else {
d[y]--;
if (!d[y]) {
st[y] = 0;
q.push(y);
}
}
}
}
}
int main() {
cin.tie(0)->sync_with_stdio(false);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
e[y].push_back(x);
d[x]++;
}
toposort();
if (st[1] == 1)
cout << "Alice";
else if (st[1] == 0)
cout << "Bob";
else
cout << "Draw";
return 0;
}
B.跳跃
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
void solve()
{
string s;
cin>>s;
int n=s.size();
map<char,vector<int>>lay;
for(int i=0;i<n;i++)
{
lay[s[i]].push_back(i);
}
int d=(s[0]<s[n-1])?1:-1;
//看是递增还是递减序列,最小的代价就是起点减去终点的绝对值
vector<int>ans;
for(char c=s[0];c!=s[n-1]+d;c+=d)
{
for(auto now:lay[c])
{
ans.push_back(now);
}//每次找当前点紧邻的下一个点是否存在,从大到小找,或从小到大找
}
int cost=0;
for(int i=1;i<ans.size();i++)
{
cost+=abs(s[ans[i]]-s[ans[i-1]]);
}
cout<<cost<<" "<<ans.size()<<endl;
}
signed main()
{
cin>>t;
while(t--)
{
solve();
}
return 0;
}
C。关于不知名的幽夜净土守护者在风起地大战QQ人保卫蒙德这档事
整活题目,请勿当真(小声)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define de(x) cout << x << " ";
#define sf(x) scanf("%d", &x);
#define Pu puts("");
#define int long long
const int N = 1e5 + 10;
struct E {
int h, p;
} e[N];
int n, m, k;
bool cmp(E a, E b) {
if (a.p == b.p)
return a.h < b.h;
return a.p < b.p;
}
signed main(){
int T;
cin >> T;
while (T--) {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
sf(e[i].h);
}
for (int i = 1; i <= n; i++) {
sf(e[i].p);
}
sort(e + 1, e + n + 1, cmp);
int damage = k;
int id = 1;
while (id <= n && k > 0) {
while (damage >= e[id].h && id <= n)
id++;
if (id > n)
break;
k -= e[id].p;
if (k > 0)
damage += k;
}
int f = 1;
for (int i = 1; i <= n; i++) {
if (damage < e[i].h) {
f = 0;
break;
}
}
if (f == 1)
puts("YES");
else
puts("NO");
}
}
D.石堆
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int N=2e5+10,mod=1e9+7;
#define int long long
int t,n;
int a[N],b[N];
signed main(){
// freopen("10.in","r",stdin);
// freopen("10.out","w+",stdout);
cin >> t;
while(t--){
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
int l = 1,r = mod;
while(l < r){
int mid = (l+r+1)/2;
vector<int> f(a,a+n+1);
int flag = 0;
int m = 0;
for(int i=n;i>=3;i--){
int p = min(a[i]/3,max((f[i]-mid)/3,m));
f[i-2] += 2*p;
f[i-1] += p;
}
for(int i=1;i<=n;i++)
if(f[i] < mid) flag = 1;
if(flag == 0) l = mid;
else r = mid - 1;
}
cout << l << endl;
}
}
E.神奇的会说话的小球
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define INF 0x3f3f3f3f
const int N=110;
bool vis[N][N];
int a[N][N];
int n,m;
int mx,my;
int ans=0;
int dx[4]={0,1,-1,0};
int dy[4]={1,0,0,-1};
void dfs(int x,int y,int l)
{
ans=max(ans,l);
// cout<<"**"<<ans<<endl;
for(int i=0;i<4;i++)
{
int tx,ty;
tx=x+dx[i];
ty=y+dy[i];
if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&!vis[tx][ty]&&a[tx][ty]<a[x][y])
{
vis[tx][ty]=1;
dfs(tx,ty,l+1);
vis[tx][ty]=0;
}
}
return ;
}
void solve()
{
cin>>n>>m;
int maxx=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]>=maxx)
{
maxx=a[i][j];
mx=i,my=j;
}
}
int res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
dfs(i,j,1);
res=max(res,ans);
}
cout<<res<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
t=1;
// cin>>t;
while(t--)
{
solve();
}
return 0;
}
F.决定就是你了 皮卡丘
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int m1,m2,n;
int f[N][N];
void solve(){
cin>>m1>>m2>>n;
m2--;
for(int i=1;i<=n;i++){
int v1,v2;
cin>>v1>>v2;
for(int j=m1;j>=v1;j--){
for(int k=m2;k>=v2;k--){
f[j][k]=max(f[j][k],f[j-v1][k-v2]+1);
}
}
}
cout<<f[m1][m2]<<" ";
for(int k=0;k<=m2;k++)
if(f[m1][k]==f[m1][m2]){
cout<<m2-k+1<<endl;
return;
}
}
int main(){
int Test=1;
// cin>>Test;
for(int i=1;i<=Test;i++){
solve();
}
}
G.一道简单的面试题
#include<bits/stdc++.h>
using namespace std;
int n,k,a[7],b[7],p[7];
bool f=1,u[7];
void dfs(int s){
if(s==k+1){
if(f)
for(int i=1;i<=k;i++)
printf("%d ",p[i]);
f=0;
return;
}
//边界
for(int i=1;i<=n;i++)
if(a[i]-b[s]>=0&&!u[i]){
p[s]=i,u[i]=1;
dfs(s+1);
u[i]=0;
}
return;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
for(int i=1;i<=k;i++)
scanf("%d",b+i);
dfs(1);
if(f)
puts("-1");
return 0;
}
H.数学题
#include <iostream>
#include <climits>
#include <string.h>
#include <string>
#include <stdio.h>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <algorithm>
#include <math.h>
#include <cctype>
#include <stdlib.h>
#include <unordered_map>
#define INTINF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define N 2000010
#define rep(i , a , b) for(int i=(a) ; i <= (b) ; i++)
#define dwn(i , a , b) for(int i=(a) ; i >= (b) ; i--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
inline ll read(){ll s=0,f=1;char c=getchar();for(;c<'0'||c>'9';c=getchar()) f=-1;for(;c>='0'&&c<='9';c=getchar()){s=s*10+c-'0';}return s*f;}
int n;
int l,r,x,y;
/*
gcd(a,b)=x,lcm(a,b)=y;
x*y=a*b
*/
void solve()
{
cin>>l>>r>>x>>y;
if(y%x)
{
cout<<"0\n";
return;
}
int ans=0;
int n=y/x;
for(int a=1;a*a<=n;a++)
{
if(n%a==0)
{
int b=n/a;
if(b*x>=l&&b*x<=r&&a*x>=l&&a*x<=r&&__gcd(a,b)==1)
{
if(a!=b) ans++;
ans++;
}
}
}
cout<<ans<<'\n';
}
int main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}
I.双圆舞
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
struct bian
{
double w;
int z;
bool operator < (const bian &other) const
{
return w > other.w;
}
};
int read() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
long long ans = 1;
int n;
int main ()
{
ios::sync_with_stdio(false);
cin>>n;
long long t1 = 1 ;
long long t2 = 1;
for (int i = 1 ; i <= n/2-1; i++ )
{
t1*=i;
}
for (int i = n/2 + 1 ; i <= n ; i++ )
{
ans*=i;
}
ans = (ans * t1 )/(n);
cout<<ans<<"\n";
return 0 ;
}
J.交换序列
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int n,m,a[maxn],x,b[maxn],k;
int main()
{
int t; cin >> t;
while( t-- )
{
cin >> n >> k;
int ans = 1e9,ok=1;
for(int i=1;i<=n;i++)
{
cin >> a[i];
if( a[i]<a[i-1] ) ok=0;
}
if( ok ){ cout << 0 << endl; continue; }
for(int i=1;i<=n;i++)
{
b[i]=k;
for(int j=1;j<=n;j++)
if( j!=i ) b[j]=a[j];
sort( b+1,b+1+n );//最终的序列
int temp = 0,now = k,flag=1;
for(int j=1;j<=n;j++)
{
if( a[j]==b[j] ) continue;
else//不相等要交换
{
if( a[j]<=now ) flag=0;//要交换却反而不能交换
else//可以交换啊
{
temp++;
if( b[j-1]>now ) flag = 0;//需要保证交换后是大于之前的数字的
now = a[j];
}
}
if( flag == 0 ) break;
}
if( flag ) ans = min( ans,temp );
}
if( ans==1e9 ) ans=-1;
cout << ans << endl;
}
}
K.品尝
#include<bits/stdc++.h>
typedef long long ll;
const int maxn=1e7+10;
const int mod=1e9+7;
using namespace std;
int ans=-233333333,n,m,a,sum[maxn];
deque<int>q;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
sum[i]=sum[i-1]+a;
}
q.push_back(0);
for(int i=1;i<=n;i++)
{
while(q.front()+m<i)
q.pop_front();
ans=max(ans,sum[i]-sum[q.front()]);
while(!q.empty()&&sum[q.back()]>=sum[i])
q.pop_back();
q.push_back(i);
}
printf("%d\n",ans);
return 0;
}
L.数组的MEX
#include <bits/stdc++.h>
using namespace std ;
const int N = 1e6 + 10 ;
#define endl '\n' ;
#define int long long
typedef pair<int,int> PII ;
int s[N] , sum[N] ;
void solve() {
int n; cin >> n;
for(int i = 0 ; i<= n; i++) s[i] = 0 ;
for(int i = 0 ;i < n ;i ++)
{
int x ; cin >> x;
s[x] ++ ;
}
sum[0] = s[0] ;
for(int i = 1 ;i <= n ; i++) sum[i] = sum[i-1] + s[i] ;
int last = 0 ;
int i ;
priority_queue<int> q ;
for( i = 0 ; i<=n ; i ++)
{
if(i == 0 )
{
cout << s[i] << " " ;
}
else{
if(sum[i-1] < i)
{
break ;
}
int t = q.top() ;
q.pop() ;
last += i-1 - t ;
cout << last + s[i] << " " ;
}
for(int j = 0 ; j < s[i] ; j ++) q.push(i) ;
}
for(int j = 0 ; j < (n - i + 1) ; j ++) cout << -1 << " " ;
cout << endl ;
}
signed main()
{
ios::sync_with_stdio(0) ;
cin.tie(0) , cout.tie(0) ;
int t; cin >> t ;
while(t -- ) {
solve();
}
return 0 ;
}
0 条评论
目前还没有评论...