Codeforces Round#649(Div.2)個人問題解(A,B,C)
2654 ワード
A題:題意:一番長い数の列とxで割り切れない数の列を見つけて、元の数の列から最初から削除するか、最後から削除するか(連続的に削除しなければならない).考え方:接頭辞と配列を直接設定し、最大値を繰り返し判断すればいい.すべての要素がxで割り切れるなら、直接-1を出力する.
B題:題意:配列aをあげて、aのサブシーケンスbが1を満たすことを求めます.|b 1-b 2|+|b 2-b 3|+...+|bn-1-bn|が最大;2.1に基づいてb中の要素個数の最小を満たす.考え方:ai-ai+kがインクリメント,減算,等しい場合,b配列ではaiとai+kを取ればよい.
C題:題意:配列aをあげます.配列bを求めてaiを(b 1-bi)に現れなかった最小非負の整数.構想:まずa配列はインクリメントシーケンスでなければ実現できない.a 1が1より大きいと実現できない.その上で循環処理を行い、aiがai-1に等しくなければbiはai-1の位置を記入すべきである.そうしないと、最初のa配列に現れなかった値を見つけてbiに与える.例えば:元の配列:1 1 2 44 6 8 b 1(1番目に現れない値は0)=0 b 2(2番目に現れない値は3)=3 b 3(a 3!=a 2)=a 2=1 b 4=a 3=2 b 5=5 b 6=7 b 7=4 b 8=6
#include
#include
#include
#include
#include
#define MAX 100005
typedef long long ll;
using namespace std;
int arr[MAX];
int pre[MAX];
int main()
{
int t;
cin >> t;
while(t--)
{
int n,x;
cin >> n >> x;
int flag=0;
int sum=0;
for(int i=0;i
B題:題意:配列aをあげて、aのサブシーケンスbが1を満たすことを求めます.|b 1-b 2|+|b 2-b 3|+...+|bn-1-bn|が最大;2.1に基づいてb中の要素個数の最小を満たす.考え方:ai-ai+kがインクリメント,減算,等しい場合,b配列ではaiとai+kを取ればよい.
#include
#include
#include
#include
#include
#include
#include
#define MAX 100005
using namespace std;
int arr[MAX];
int ans[MAX];
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
int cnt=0;
scanf("%d %d",&arr[0],&arr[1]);
ans[cnt++]=arr[0];
int flag=0;\\0 ,1 ,-1
if(arr[1]>arr[0]) flag=1;
else if(arr[1]arr[i-1])
{
ans[cnt++]=arr[i-1];
flag=1;
}
else if(arr[i]=arr[i-1])
{
if(arr[i]==arr[i-1])
{
ans[cnt++]=arr[i-1];
flag=0;
}
else if(arr[i]>arr[i-1])
{
ans[cnt++]=arr[i-1];
flag=1;
}
}
}
ans[cnt++]=arr[n-1];
cout << cnt <
C題:題意:配列aをあげます.配列bを求めてaiを(b 1-bi)に現れなかった最小非負の整数.構想:まずa配列はインクリメントシーケンスでなければ実現できない.a 1が1より大きいと実現できない.その上で循環処理を行い、aiがai-1に等しくなければbiはai-1の位置を記入すべきである.そうしないと、最初のa配列に現れなかった値を見つけてbiに与える.例えば:元の配列:1 1 2 44 6 8 b 1(1番目に現れない値は0)=0 b 2(2番目に現れない値は3)=3 b 3(a 3!=a 2)=a 2=1 b 4=a 3=2 b 5=5 b 6=7 b 7=4 b 8=6
#include
#include
#include
#include
#include
#include
#include
#define MAX 100005
using namespace std;
int arr[MAX];
int ans[MAX];
bool vist[MAX];
int main()
{
int n;
cin >> n;
int flag=1;
for(int i=0;i