C题fst了…… 感觉状态不是很好…… 最近得好好复习考试了…… 可能得等寒假再捡回来编程了……
直接用3个数组存相应技能有哪些人会,然后从下标0开始凑队即可
Code:
#include <cmath>
#include <cctype>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int t[10086]={0};
int a[5]={0};
vector<int> q[5];
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
bool cmp(const int a, const int b)
{
return a > b;
}
int main()
{
int n=0; cin>>n;
for(int i=0;i<5;i++)q[i].clear();
for(int i=0;i<n;i++)
{
scanf("%d",&t[i]);
a[t[i]]++;
q[t[i]].push_back(i+1);
}
int minv=min(a[1],min(a[2],a[3]));
printf("%d\n",minv);
for(int i=0;i<minv;i++)
{
printf("%d %d %d\n",q[1][i],q[2][i],q[3][i]);
}
return 0;
}
我们不难发现,这些首尾相接的东西最终会串成两条链,分别为队伍中为奇数和队伍中为偶数的人们,然后把这个链组合起来即可
(0,a)说明a是第二个人,(b,0)说明b是倒数第二个人。
这个题目的要点在于队伍长度奇数和偶数时不同,需要判断。
Code:
#include <cmath>
#include <queue>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int a[2000086]={0};
int b[2000086]={0};
int frt[2000086]={0};
int bnd[2000086]={0};
int ans[2000086]={0};
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
bool cmp(const int a, const int b)
{
return a > b;
}
int main()
{
int n=0; cin>>n;
int head,tail;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
frt[b[i]]=a[i];
bnd[a[i]]=b[i];
if(a[i]==0) head=b[i];
if(b[i]==0) tail=a[i];
}
int now=head,pos=1,tmp=0;
while(now)
{
ans[pos]=now;
now=bnd[now];
if(now) frt[now]=0;
pos+=2;
}
if(n%2==0)
{
now=tail,pos=n-2;
while(now)
{
ans[pos]=now;
now=frt[now];
pos-=2;
}
}
else
{
int pi;
for(int i=0;i<n;i++)
{
if(frt[b[i]] && b[i]!=0)
{
pi=b[i];
while(frt[pi])
{
pi=frt[pi];
}
break;
}
}
int now=pi,pos=0,tmp=0;
while(now)
{
ans[pos]=now;
now=bnd[now];
if(now) frt[now]=0;
pos+=2;
}
}
for(int i=0;i<n;i++)
{
printf("%d",ans[i]);
if(i<n-1)printf(" ");
}
return 0;
}
吾辈的C题Fst了…… TLE@Test42
安心的读字符串处理就好了呀Q^Q 我为啥要string和longlong联用呢……Q^Q
关于当前字符串是否可以被某个数整除,我们每次都留下余数然后向后增加位数继续留下直至余数,即可~
Code:
#include <cstdio>
#include <cstring>
char in[1048576], vis[1048576];
int main() {
int a, b, n, t(0), base(1), i; scanf("%s%d%d", in, &a, &b);
n = strlen(in);
for (i = 1; i < n; ++i) {
t = (t * 10 + in[i - 1] - '0') % a;
vis[i] = !t;
}
t = 0;
for (i = n - 1; i > 0; --i) {
(t += base * (in[i] - '0')) %= b;
if ((in[i] - '0') && !t && vis[i]) break;
(base *= 10) %= b;
}
if (!i) puts("NO");
else {
puts("YES");
for (int j = 0; j < i; ++j) putchar(in[j]);
putchar('\n'); puts(in + i);
}
}
#import<bits/stdc++.h>
int a, b, c, n, p=1, i, d[1<<20];
char m[1<<20];
main() {
gets(m);
n = strlen(m);
scanf("%d%d", &a, &b);
for (i=n-1; i>=0; i--) {
d[i] = ((m[i] - '0') * p + d[i + 1]) % b;
p = p * 10 % b;
}
for (i=1; i<n; i++) {
c = (c * 10 + m[i - 1] - '0') % a;
if (!c && !d[i] && m[i] != '0') {
puts("YES");
printf("%.*s\n%s", i, m, m + i);
return 0;
}
}
puts("NO");
}