A 点数计算——模拟
#include<iostream>
#include<algorithm>
using namespace std;
int p,d,f,b,sum,w;
long long cnt;
int main()
{
cin>>p>>b>>f>>d;
if(b<5)
{
if(d==0) w=20;
else w=30;
cnt=w+f;
if(cnt%10!=0) cnt=(cnt/10+1)*10;
cnt=cnt * 1<<(b+4);
if(cnt>8000) cnt=8000;
}
else
{
if(b==5) cnt=8000;
else if(b==6||b==7) cnt=12000;
else if(b>=8&&b<=10) cnt=16000;
else if(b==11||b==12) cnt=24000;
else if(b>=13) cnt=32000;
}
//cout<<cnt<<endl;
if(p==0)//庄家
{
cnt=cnt*1.5; //无论如何点数都是1.5倍
if(d==0)//自摸
{
int x=cnt/3;
if(x%100) x=(x/100+1)*100;
cnt=x*3;
}
else//容和
{
if(cnt%100) cnt=(cnt/100+1)*100;//注意最终点数一定是100的倍数(最小是100)
}
}else//闲家
{
if(d==0)//自摸
{
int x=cnt/2,y=cnt/4;
if(x%100) x=(x/100+1)*100;
if(y%100) y=(y/100+1)*100;
//cout<<x<<" "<<y<<endl;
cnt=x+y*2;
}
else//容和
{
if(cnt%100) cnt=(cnt/100+1)*100;
}
}
cout<<cnt<<endl;
return 0;
}
F 长度大于1的回文串
两种可能,s[i]=s[i+1]
连续相等的两个字符构成长度为2的回文串
s[i]=s[i+2]
两个相等字符中间加单个字符
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string s;
cin>>s;
int cnt=0;
for(int i=0;i<s.size();i++)
{
if(s[i]==s[i+1]||s[i]==s[i+2]) cnt++;
}
if(cnt>0) puts("o_O");
else puts("O_o");
return 0;
}
B 田忌赛马——贪心
- 每次找刚刚大于
a[i]
的数字,然后归0
(大于a[i]
的数字中尽可能小的) - 先排序
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+10;
int a[N],b[N];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
sort(a,a+n);
sort(b,b+n);
int j=0,cnt=0;
for(int i=0;i<n;i++)
{
if(a[i]>b[j]&&j<n) cnt++,j++;
}
cout<<cnt<<endl;
return 0;
}