A
原题链接
思路: 模拟找规律
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int test=1;
//int n,a[N];
int a,b,c,d;
int main()
{
scanf("%d",&test);
while(test--)
{
scanf("%d %d %d %d", &a, &b, &c, &d);
if(b<a && c<=d)
{
cout << -1 << endl;
continue;
}
else if(b>=a)
{
cout << b << endl;
continue;
}
long long res = b, tot = b;
long long cnt = (a-tot)/(c-d);
res += cnt*c;
tot+=cnt*(c-d);
if(tot<a)
{
tot+=c-d;
res+=c;
}
cout << res << endl;
}
return 0;
}
B
原题链接
思路:双指针
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int test=1;
int n,a[N];
string s;
int main()
{
scanf("%d",&test);
while(test--)
{
vector<pair<int,int> > d,e,f;
cin >> s;
int x=0,y=0,z=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='1')
x++;
else if(s[i]=='2')
y++;
else
z++;
}
if(x==0 || y==0 || z==0)
{
cout << 0 << endl;
continue;
}
int q[200005]={0},p[200005],cnt=1;
q[1] = 1;
p[1] = s[0]-'0';
for(int i=1;i<s.length();i++)
{
if(s[i]==s[i-1])
q[cnt]++;
else
{
q[++cnt]++;
p[cnt] = s[i]-'0';
}
}
int res = 200005;
for(int i=2;i<cnt;i++)
{
if(p[i-1]!=p[i+1])
res = min(res,q[i]+2);
}
cout << res << endl;
}
return 0;
}
C1
原题链接
思路:找规律的几何题
以十二边形为例,找出图中的那个小直角三角形。则可以通过几何关系得出 α = 90/n°, 小直角边的长度是1/2, 则答案为大直角边的两倍,也就是 1/tan(pi/2/n), 注意精度。
代码
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
const int N = 2e5+10;
int test=1,n;
int main()
{
scanf("%d",&test);
while(test--)
{
cin >> n;
cout << fixed << setprecision(9) << (1.0 / tan(pi/2/n)) << endl;
}
return 0;
}
D
题目链接
思路:官方题解是二分
代码
#include<bits/stdc++.h>
using namespace std;
int n, q;
vector<int> a, k;
int count_le(int x)
{
int cnt = 0;
for(auto y : a)
if(y <= x)
cnt++;
for(auto y : k)
{
if(y > 0 && y <= x)
cnt++;
if(y < 0 && abs(y) <= cnt)
cnt--;
}
return cnt;
}
int main()
{
scanf("%d %d", &n, &q);
a.resize(n);
k.resize(q);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
for(int i = 0; i < q; i++)
scanf("%d", &k[i]);
if(count_le(int(1e9)) == 0)
{
puts("0");
return 0;
}
int lf = 0;
int rg = int(1e6) + 1;
while(rg - lf > 1)
{
int mid = (lf + rg) / 2;
if(count_le(mid) > 0)
rg = mid;
else
lf = mid;
}
printf("%d\n", rg);
return 0;
}