1001 Oracle
问题描述
曾经有一位国王,统治着一片未名之地。他膝下有三个女儿。
三个女儿中最年轻漂亮的当属Psyche。她的父亲不确定她未来的命运,于是他来到Delphi神庙求神谕。
神谕可以看作一个不含前导零的正整数n n n。
为了得到真正的预言,他可以将n n n的各个数位重新排列,并将其分成两个不含前导零的正整数。
请你帮助他求出这两个正整数最大的和。如果不存在这样的两个正整数,输出”Uncertain”.
思路:
取出已经存在的一个1~9里边最小的数,剩下的从大到小排序然后加上这个数就OK了…
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x&(-x))
typedef long long LL;
const int maxn = 10000005;
const int inf=(1<<28)-1;
char str[maxn];
int A[maxn];
int Num[10];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(A,0,sizeof(A));
scanf("%s",str);
int len=strlen(str);
memset(Num,0,sizeof(Num));
int cnt=0;
for(int i=0;i<len;++i)
{
if(str[i]!='0') cnt++;
Num[str[i]-'0']++;
}
if(cnt<2)
{
printf("Uncertain\n");
continue;
}
int Add=-1;
for(int i=1;i<=9;++i)
if(Num[i])
{
Add=i;
Num[i]--;
break;
}
len=1;
for(int i=9;i>=0;--i)
for(int j=1;j<=Num[i];++j)
A[len++]=i;
A[len-1]+=Add;
for(int i=len-1;i>=1;--i)
if(A[i]>=10)
{
A[i-1]+=A[i]/10;
A[i]%=10;
}
if(A[0]) printf("%d",A[0]);
for(int i=1;i<len;++i)
printf("%d",A[i]);
printf("\n");
}
return 0;
}
1002 Arrange
Cupid一不小心将爱情之箭射到了自己,他爱上了Psyche。
这引起了他的母亲Venus的注意。Venus将Psyche带到了一堆打乱的谷堆旁。
这儿共有n n n堆稻谷,编号为1 1 1到n n n。Psyche需要将这些谷堆以某种顺序排列,设最终排在第i i i位的谷堆是Ai
她得知了一些该排列的要求:
1. 对于任意整数i∈[1,n] i \in [1,n] i∈[1,n],A1,A2,…,Ai A_1, A_2, …, A_i 的最小值为Bi
2. 对于任意整数i∈[1,n] i \in [1,n] i∈[1,n],A1,A2,…,Ai A_1, A_2, …, A_i A1,A2的最大值为Ci
现在Psyche想知道,共有多少种合法的排列。由于答案可能很大,输出时对998244353 998244353 998244353取模。
思路:
输出0有三种情况
1.B[i]>B[i-1] || C[i]
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x&(-x))
typedef long long LL;
const int maxn = 100005;
const int inf=(1<<28)-1;
const LL mod = 998244353;
int B[maxn],C[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&B[i]);
for(int i=1;i<=n;++i)
scanf("%d",&C[i]);
int cnt=0;
int Max=B[1],Min=C[1];
bool flag=false;
LL Ans=1;
if(Max!=Min) flag=true;
for(int i=1;i<=n;++i)
{
cnt++;
if(B[i]>Min||C[i]<Max) flag=true;
if(B[i]!=Min&&C[i]!=Max) flag=true;
if(cnt>C[i]-B[i]+1) flag=true;
if(!(B[i]==Min&&C[i]==Max))
{
Min=B[i],Max=C[i];
continue;
}
Min=B[i],Max=C[i];
Ans=(Ans*(Max-Min+1-cnt+1))%mod;
//printf("%d(%d)(%d)--",flag,Max,Min);
}
if(flag) printf("0\n");
else printf("%lld\n",Ans);
}
return 0;
}
1003 Wool
问题描述
黎明时,Venus为Psyche定下了第二个任务。她要渡过河,收集对岸绵羊身上的金羊毛。
那些绵羊狂野不驯,所以Psyche一直往地上丢树枝来把它们吓走。地上现在有n n n根树枝,第i i i根树枝的长度是ai
如果她丢的下一根树枝可以和某两根树枝形成三角形,绵羊就会被激怒而袭击她。
现在Psyche手中只有长度不小于L L L且不大于R R R的树枝。请你帮忙计算,她下一根可以丢多少种不同长度的树枝而不会把绵羊激怒呢?
思路:
这个嘛…判断三角形a+b>c&&a-b
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x&(-x))
typedef long long LL;
const int maxn = 100005;
const int inf=(1<<28)-1;
LL A[maxn];
pair<LL,LL>Par[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
LL L,R;
scanf("%d%lld%lld",&n,&L,&R);
for(int i=1;i<=n;++i)
scanf("%lld",&A[i]);
sort(A+1,A+n+1);
int len=1;
for(int i=2;i<=n;++i)
{
LL x=A[i],y=A[i-1];
//printf("***%lld %lld\n",x-y,x+y+1);
if(x+y<L) continue;
if(x-y+1>R) continue;
Par[len].first=max(x-y+1,L);
Par[len++].second=min(R+1,x+y);
}
sort(Par+1,Par+len);
LL Ans=R-L+1,Right=Par[1].second;
Ans-=Par[1].second-Par[1].first;
//for(int i=1;i<len;++i)
// printf("**%lld %lld\n",Par[i].first,Par[i].second);
for(int i=2;i<len;++i)
{
if(Par[i].second>Right)
{
Ans-=Par[i].second-max(Par[i].first,Right);
Right=Par[i].second;
}
}
printf("%lld\n",Ans);
}
return 0;
}