A - Odd Palindrome
题意:给你一个字符串如果它的所有回文子串长度为奇数,输出Odd.否则输出Or not.
思路:其实只要判断是否有两个相连的字符就可以了
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
int n;
string s;
void solve()
{
bool flag=0;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]==s[i+1])
{
flag=1;
break;
}
}
if(flag)cout<<"Or not."<<endl;
else cout<<"Odd."<<endl;
}
signed main()
{
Ysanqian;
int T;
T=1;
//cin >> T;
while (T--)solve();
return 0;
}
B - Latin Squares
题意:给你一个数n,然后给出一个n*n的图,图的元素只能为0~n-1,但是当n>10时,就用A~Z表示10~35,然后就是每个数在每行每列只能出现一次(就是每一行,每一列都包函0~n的所有元素一次)
如果不满足上述条件就输出NO,满足则判断一下第一行,第一列是不是都是递增的,如果是输出Reduced,否则输出Not Reduced
这个狗题给我罚时发坏了,到最后都不知道哪里错了,改了个多组输入就过了
思路:n的范围为0~35可以用0n3的复杂度,那么我们就可以遍历每一个数的列和行,看看是否有重复元素,然后就单拉出来第一行,第一列判断即可
(本来加了一些break之类的,但是实在太肿了,就去掉了,虽然会慢一丢丢,但是毕竟就35影响不大)
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
int n;
char s[M][M];
signed main()
{
Ysanqian;
while (scanf("%d", &n) != EOF)
{
int flag = 0;
for (int i = 0; i < n; i++)
scanf("%s", s[i]);
for (int i = 0; i < n; i++)//前两层遍历每一个数,k遍历行和列
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
if (k != j)
{
if (s[i][j] == s[i][k] && flag == 0)
flag = 2;
}
if (k != i)
{
if (s[i][j] == s[k][j] && flag == 0)
flag = 2;
}
}
}
}
for (int i = 1; i < n; i++)
{
if (s[0][i - 1] >= s[0][i] && flag == 0)
{
flag = 1;
break;
}
if (s[i - 1][0] >= s[i][0] && flag == 0)
{
flag = 1;
break;
}
}
if (flag == 1)
printf("Not Reduced\n");
else if (flag == 2)
printf("No\n");
else
printf("Reduced\n");
}
return 0;
}
D-Halfway
题意:您的一个朋友编写了一个程序。对于n个项目,其工作方式如下。首先,它打印一个1,并将项目1与项目2、3、4,.... n进行比较。然后打印一个2,然后将项目2与项目3、4、5......n进行比较。您的朋友想知道他的程序何时完成了一半。对于进行总比较数为奇数的程序,这是在正在进行中间比较时。对于进行偶数次总比较的程序,这是在进行两次中间比较中的第一个时。
问:程序完成一半时,最后打印的数字是什么?
思路:就是找完成一半时,打印了谁,直接模拟就可以了,就是用个上取整就行了
我看别人有用二分写的,也没仔细看具;感兴趣可以去找一些
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
int n,m;
int sum;
void solve()
{
cin>>n;
m=n;
for(int i=1;i<n;i++)
sum+=i;
// cout<<sum<<endl;
int res=0;
for(int i=1;i<n;i++)
{
res+=(m-1);
if(res>=(sum+1)/2)向上取整
{
cout<<(int)i<<endl;
break;
}
m--;
}
}
signed main()
{
Ysanqian;
int T;
T=1;
//cin >> T;
while(T--)solve();
return 0;
}
H-Unloaded Die
题意:给你一个六面骰子每个面出现的概率,问如何修改一面的点数可以让其公平(就是平均值=3.5)
求最小差值的绝对值
思路:我们贪心的想,当我们修改概率最大的数时候,就可以让差值最小,有多个概率最大的,随便一个都行(例如,2和5的概率都为0.2,那么让他们都变化2,都会让结果增加2*0.2=0.2)
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
struct node
{
double x;
int idx;
} a[N];
bool cmp(node a, node b)
{
return a.x > b.x;
}
double sum, ans;
void solve()
{
for (int i = 1; i <= 6; i++)
{
cin >> a[i].x;
a[i].idx = i;
sum += 1.0 * i * a[i].x;
}
sort(a + 1, a + 1 + 6, cmp);
double res = 1.0 * fabs(3.5000 - sum) / a[1].x;
printf("%.3lf", 1.0 * res);
}
signed main()
{
Ysanqian;
int T;
T = 1;
// cin >> T;
while (T--)
solve();
return 0;
}
K-Star Arrangements
题意:给你一个星星总数n,让你找到满足以下条件的所有方案来组成这样一个星旗(只需要输出第一行和第二行的星星数就行)
1. 星星的数目隔行相等
2.相邻两行星星数目最多差一个(当然可以相等)
3.第一行星星数要不少于第二行
思路:直接从2枚举存到 ( s + 1 ) / 2 (向上取整)
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
int s;
void solve()
{
cin >> s;
cout << s << ':' << endl;
for (int i = 2; i <= (s + 1) / 2; i++)
{
for (int j = i - 1; j <= i; j++)
{
if (s % (i + j) == i || s % (i + j) == 0)
cout << i << ',' << j << endl;
}
}
}
signed main()
{
Ysanqian;
int T;
T = 1;
// cin >> T;
while(T--)solve();
return 0;
}
L-Delayed Work
题意:一个工人工作需要k天,一个工人不论干多少天都只花费X元,然而没干一天,你还需支出P元的罚款,你可以请任意多的工人完成工作,问你最少花费
思路:第一做的时候枚举做的,后来又想用基本不等式也可以当且仅当时等号成立,但是这样算出来人数肯能不是整数,故可以用两个取整再取min解决
1:基本不等式
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
int s;
int k, x, p;
void solve()
{
cin >> k >> p >> x;
double m = sqrt(p * k / x);
int ans1 = (int)m;
int ans2 = (int)m + 1;
double ans = min(1.0 * p * k / ans1 + ans1 * x, 1.0 * p * k / ans2 + ans2 * x);
printf("%.3lf\n", 1.0 * ans);
}
signed main()
{
Ysanqian;
int T;
T = 1;
// cin >> T;
while (T--)
solve();
return 0;
}
2:枚举
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
int k,p,x;
double ans,day;
void solve()
{
cin>>k>>p>>x;
ans=1e9;
for(int i=1;i<=20000;i++)
{
day=1.0*k/(1.0*i);
ans=min(1.0*day*p+x*i,ans);
}
printf("%.3lf\n",1.0*ans);
}
signed main()
{
Ysanqian;
int T;
T=1;
//cin >> T;
solve();
return 0;
}
M-Forbidden Zero
题意:就是给你一个数n,找到它下一个数,前提这个数不含0
思路:直接模拟就行
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
int n;
int fun(int x)
{
int i, res;
for (i = x + 1; i; i++)
{
bool flag = 0;
int m = i;
while (m > 0)
{
res = m % 10;
if (res == 0)
{
flag = 1;
break;
}
m /= 10;
}
if (!flag)
break;
}
return i;
}
void solve()
{
cin >> n;
cout << fun(n) << endl;
}
signed main()
{
Ysanqian;
int T;
T = 1;
// cin >> T;
while (T--)solve();
return 0;
}
G Security Badge(区间离散化+dfs)
额,这题是后来补的,当时也不知道该怎么办,写昏头了
看了很多题解,看的是昏头昏脑的搬运工太多了(环境太差了),看了好久也想了好久,终于是全想明白了,正好补上
题意:就是n个房间,m个门,每个门都有一个区间,只有编号在这个区间内的人才可以走,
然后就是k个人(编号1~k)但是他说k一定大于门的右区间,那就和k没啥关系了,看门的区间就行了
思路:
1:我们想最终的可行区间是由什么组成?肯定是有可以到达终点的所有门的区间的交集组成的
2:答案区间有什么特点吗?它的左区间一定是某一个门的区间的左区间,右区间同理
3:那么重要的来了,我们存下所有的门的左右端点,然后排序,排序后每相邻的两点,一定是最小的区间,枚举到点能从期点到终点的话就可以加入这个点和前一个点区间的长度了。
那么为什么这样一定对呢,不是说它的左区间一定是某一个门的区间的左区间,右区间同理
这样排序后难道不会有一个门的有区间减左区间吗,答案是一定会有,所以重要的是我们在vector存左区间时,让其减一变为左开右闭这样就会避免这种情况,额可能干说太抽象
举个例子:这个例子呢答案为 1~2,4~5,总长度为4
3 3 5 此时不减一的端点数组为 0(1,2,4,4,5,5),前面补一个0,那么答案就是[0,1].[1,2],[2,4]
1 2 [4,5]可见[0,1]和[2,4]根本就不存在
1 2 1 2 而左端点减一的端点数组为0(0,2,3,3,5,5) ,那么答案为 (0,2],(3,5]也就是[1,2],[4,5]长
1 3 4 5 度为4
3 2 4 5
(额,只能说尽力说的详细了,当然佬可能不需要这样也明 白,就当看个热闹吧(蒻)....当然可能理解不到位,欢迎 纠错)
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
const int N = 1e6 + 6000, M = 1010, inf = 0x3f3f3f3f, mod = 1e9 + 7;
int n,m,k,s,t,ans;
bool st[N];
struct edge
{
int v,down,up;//区间上下界
};
vector<edge>g[N];
vector<int>p;
void dfs(int u,int x)
{
st[u]=1;
for(auto ed:g[u])
{
int v=ed.v,down=ed.down,up=ed.up;
if(!st[v]&&down<=x&&x<=up)dfs(v,x);
}
}
void solve()
{
cin>>n>>m>>k>>s>>t;
for(int i=0;i<m;i++)
{
int u,v,down,up;
cin>>u>>v>>down>>up;
g[u].pb({v,down,up});
p.pb(down-1);
p.pb(up);
}
sort(p.begin(),p.end());
for(int i=0;i<2*m;i++)//这里我第一遍交是i=1开始,后来一想这个做左区间被减了1,一定不能走到
{ 终点,所以不影响
memset(st,0,sizeof st);
dfs(s,p[i]);
if(st[t])ans+=p[i]-p[i-1];
}
cout<<ans<<endl;
}
signed main()
{
Ysanqian;
int T;
T = 1;
// cin >> T;
while (T--)solve();
return 0;
}