奔赴图灵杯现场
题解:贪心
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;cin>>t;
while(t--){
int n,m,x;
cin>>n>>m>>x;
n+=m;
if(n%x==0) cout<<n/x-1<<endl;
else cout<<n/x<<endl;
}
return 0;
}
漫漫上学路
题解:模拟,注意黄灯之后要等红灯
#include<bits/stdc++.h>
using namespace std;
int main(){
int r,y,g,n;
cin>>r>>y>>g>>n;
int ans=0;
for(int i=1;i<=n;i++){
int k,t;
cin>>k>>t;
if(k==0||k==1) ans+=t;
if(k==2) ans+=(t+r);
}
cout<<ans<<endl;
return 0;
}
未闻mr名
题解:沙比提
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;cin>>t;
while(t--){
int L;cin>>L;
string s;cin>>s;
int flag=0;
for(int i=0;i<L-3;i++)
if(s[i]=='m'&&s[i+1]=='r'&&s[i+2]=='n'&&s[i+3]=='b'){
flag=1;break;
}
if(flag) cout<<"1"<<endl;
else cout<<"0"<<endl;
}
return 0;
}
数格子
题解:先算覆盖前的,覆盖的减去就行了
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;cin>>t;
while(t--){
int n,m,R,C;
cin>>n>>m>>R>>C;
int a,b,c;
c=n+m-1;
a=n*m/2;
if(n%2&&m%2) a++;
if(R%2) a-=(m/2+m%2);
else a-=m/2;
if(C%2) a-=(n/2+n%2);
else a-=n/2;
if((R+C)%2==0) a++;
cout<<a<<" "<<n*m-a-c<<" "<<c<<endl;
}
}
境界线上的数组
题解:用map就行了,跟官方题解不同,不知道是不是数据太弱,让我卡过了
对于一个数字,先找map中是否出现,出现减一,没出现就让其和之前确定的数字相加,加入map
时间复杂度为O(nlogn)
#include<bits/stdc++.h>
using namespace std;
const int N=10000;
int ans[N],a[N];
int main(){
int t;cin>>t;
while(t--){
int n;cin>>n;
map<int,int> M;
for(int i=1;i<=(n*n-n)/2;i++) cin>>ans[i];
if(n==1||n==2||n==3){
cout<<n-1<<endl;
continue;
}
a[1]=ans[1];a[2]=ans[2];
M[a[1]+a[2]]++;
int k=3;
for(int i=3;i<=(n*n-n)/2;i++){
if(!M[ans[i]]){
a[k]=ans[i];
for(int j=k-1;j>0;j--) M[a[k]+a[j]]++;
k++;
}
else{
M[ans[i]]--;
}
if(k==n){
k=i;break;
}
}
cout<<k<<endl;
}
}
今天又是开花的一天
题解:简单搜索,注意题意,当最后的体力为零时,应该输出的是-1,而不是0,巨TM坑
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int mp[N][N],vis[N][N],n,m,ans;
int pos[4][2]={1,0,-1,0,0,1,0,-1};
void dfs(int x,int y,int res){
if(res<0) return;
if(mp[x][y]==3) res+=5;
if(mp[x][y]==2) res-=3;
if(x==n&&y==m){
if(res>ans) ans=res;
return;
}
vis[x][y]=1;
for(int i=0;i<4;i++){
int nx=x+pos[i][0];
int ny=y+pos[i][1];
if(nx<=0||ny<=0||nx>n||ny>m) continue;
if(mp[nx][ny]==1||vis[nx][ny]) continue;
else{
dfs(nx,ny,res-1);
vis[nx][ny]=0;
}
}
}
int main(){
int t;cin>>t;
while(t--){
cin>>n>>m;
ans=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>mp[i][j];
memset(vis,0,sizeof(vis));
dfs(1,1,15);
cout<<ans<<endl;
}
}
二等分的签名照
题解:简单博弈,好像是什么巴什博奕。。。。
其他的什么尼姆博奕,威佐夫博弈都可以去百度看下
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;cin>>t;
while(t--){
int n,m;
cin>>n>>m;
if(n%(m+1)) cout<<"Yui"<<endl;
else cout<<"Mio"<<endl;
}
return 0;
}
我们仍未知道那天所看见的mr的名字
题解:不也是模拟吗,k为0时就直接加上t就行了,其他情况直接加上当前ans值取模判断在那个区间就行了
#include<bits/stdc++.h>
using namespace std;
int main(){
long long r,y,g,n;
cin>>r>>y>>g>>n;
long long mod=r+y+g;
long long ans=0;
for(int i=1;i<=n;i++){
long long k,t;
cin>>k>>t;
if(k==0) ans+=t;
else{
long long temp;
if(k==1) temp=ans+(r-t);
if(k==2) temp=ans+(r+y+g-t);
if(k==3) temp=ans+(r+g-t);
if(temp%mod<r) ans+=(r-temp%mod);
else if(temp%mod<r+g) continue;
else ans+=(2*r+g+y-temp%mod);
}
}
cout<<ans<<endl;
return 0;
}