总结这次训练赛,ioi赛制,刚开始打的时候在几道题上死磕,简单题复杂化,整个人脑子是混的,不知道自己在写什么。最后一点时间才开始骗分,总体来说,这次打的很不好。最后就写才出来三道。
B Komorebi的数学课
思路
这就是一道简单的快速幂模板。
代码
#define int long long
void pp(int a,int b,int c)
{
int res=1;
while(b!=0){
if(b&1) res=res*a%p;
a=a*a%p;
b>>=1;
}
cout<<res%p<<endl;
}
signed main()
{
int n;
cin>>n;
pp(n,n,n+2);
}
C 次佛锅
C-次佛锅
这道题比赛的时候写太复杂了
思路
1.首先注意,要吃的菜出现的次数不止一次
2.处理好第一行输入的数据(输入中含有空格,所以我们如果要读取一行字符时不能用cin)
我这里学习到其他宝子的想法,用stringstream输入流来写
当我们使用>>读取stringstream时,他会以空格来分割字符。
代码
#include<bits/stdc++.h>
using namespace std;
map<string,int> pp;
signed main()
{
string s;
getline(cin,s);//读取一整行
stringstream sin;
sin<<s;//转换成输入流
string a;
int b;
while(sin>>a>>b)//每次读取菜名及数量
{
pp[a]+=b;
}
int n;
cin>>n;
while(n--)
{
string q;
cin>>q;
cout<<pp[q]<<endl;
}
}
D Setsuna的K数列
思路
我们发现可以将n用二进制表示,将其表示的二进制转化为k进制即为答案。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
signed main()
{
int n,m;
cin>>n>>m;
int t=n;
string s;
while(t)
{
if(t&1) s+='1';//奇数二进制最后位为1,偶数为0
else s+='0';
t/=2;
}
int res=1;
int ans=0;
for(int i=0;i<s.size();i++)
{
int num = s[i]-'0';
ans=(ans+num*res) % mod;
res=res*m%mod;
}
cout<<ans<<endl;
}
G天气预报
题意
1.我们要注意到有一天都不选的可能,所以我们最后的结果要考虑是否加1
2.当我们在遍历的过程中,如果选择的天气在 i 处满足条件了,那么往后不过什么天气都肯定满足。所以我们可以直接用n-i去优化计算。(比如题目样例当i=1时 ‘0’和‘1’均满足,那么选择[1,n(n>=1)]总共有5-1种)
3.类似滑动窗口;利用双指针,右指针扩大窗口去满足题目条件,左指针去缩小窗口。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int n,a,b;
cin>>n>>a>>b;
string s;cin>>s;
int ans=0;
int x=0,y=0;
if(a+b==0) ans++;
for(int i=0,j=0;i<s.size();i++)
{
if(s[i]=='1') x++;
else y++;
while(x>=b&&y>=a&&j<=i)
{
ans+=(n-i);
if(s[j]=='0') y--;
else x--;
j++;
}
}
cout<<ans<<endl;
}
L-剪绳子
思路
这道题其实并不难,直接暴力,但比赛的时候并没有开这道题。
1.计算时要注意定义首尾位置为0.0,10.0
2.用set去储存减去的绳子坐标
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
set<double> s;
while(t--)
{
char c;double f;
cin>>c>>f;
if(c=='C')
{
s.insert(f);
}
else
{
double a=0,b=10.0;
for(auto p:s)
{
if(f<p) {b=p;break;}
a=p;
}
printf("%.5f\n",b-a);
}
}
}