2014 Shanghai Invitation Contest

时间:2024-04-20 08:04:56

题目链接

http://acm.hdu.edu.cn/search.php?field=problem&key=2014%C9%CF%BA%A3%C8%AB%B9%FA%D1%FB%C7%EB%C8%FC%A1%AA%A1%AA%CC%E2%C4%BF%D6%D8%CF%D6%A3%A8%B8%D0%D0%BB%C9%CF%BA%A3%B4%F3%D1%A7%CC%E1%B9%A9%CC%E2%C4%BF%A3%A9&source=1&searchmode=source

A:思维题

  题意:给你n个数,Jerry可以任意对每个数进行操作,操作方法是对每个数加0,或者k的整倍数。问能不能让1---n这n个数每个数只出现一次。

#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
int a[maxn],cnt[maxn];
int T,n,k;
int main ()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
bool fg=;
memset(cnt,,sizeof(cnt));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>n)
fg=;
if(fg)
cnt[a[i]]++;
}
for(int i=;i<=n&&fg;i++)//向后滚动
{
if(cnt[i]>)
{
cnt[i+k]+=(cnt[i]-);
cnt[i]=;
}
}
for(int i=;i<=n&&fg;i++)
{
if(cnt[i]!=)
fg=;
}
if(fg)
printf("Jerry\n");
else
printf("Tom\n");
}
return ;
}

B:题意很好懂算法是,线段树+扫描线。

C:

D:放置战舰(二分图)

F:给出一个表达式的系数和变量,然后输出表达式。注意下面几个点1、第一个数、最后一个数。2、正负数。3、0,-1,1特判。4、如果全部为零,输出0。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=;
char s[maxn]={'','p','q','r','u','v','w','x','y','z','j'};//10;
int a[maxn];
int T,n,k;
int main ()
{
scanf("%d",&T);
while(T--)
{
for(int i=;i<=;i++)
scanf("%d",&a[i]);
bool fg=,ok=;
for(int i=;i<=;i++)
{
if(a[i])
{
ok=;
if(fg)//第一个
{
if(i!=)
{
if(a[i]==)
{
printf("%c",s[i]);
}
else if(a[i]==-)
{
printf("-%c",s[i]);
}
else
printf("%d%c",a[i],s[i]);
}
else
printf("%d",a[i]);
fg=;
}
else
{
if(i!=)
{
if(a[i]>)
{
if(a[i]==)
printf("+%c",s[i]);
else
printf("+%d%c",a[i],s[i]);
}
else
{
if(a[i]==-)
printf("-%c",s[i]);
else
printf("%d%c",a[i],s[i]);
}
}
else
{
if(a[i]>)
printf("+%d",a[i]);
else
printf("%d",a[i]);
}
}
}
}
if(ok)
printf("0\n");
printf("\n");
}
return ;
}

J:判断安卓手机型号的大小。注意:1、如果最后一个字母是A,那么通常省略。2、如果第二个字母相同则比较后面所有的字母,否则最后一个字母不包含在内。

#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
char s1[maxn],s2[maxn];
int T;
int cmp(int s,int t)
{
for(int i=s;i<=t;i++)
{
if(s1[i]>s2[i])
return ;
if(s1[i]<s2[i])
return -;
}
return ;
}
int main ()
{
int ic=;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",s1,s2);
int l=strlen(s1);
if(l==)
s1[]=='A';
l=strlen(s2);
if(l==)
s2[]=='A';
int a1=cmp(,);
int a2;
if(s1[]==s2[])
a2=cmp(,);
else
a2=cmp(,);
printf("Case %d:",++ic);
if(a1==)
printf(" >");
else if(a1==)
printf(" =");
else
printf(" <");
if(a2==)
printf(" >\n");
else if(a2==)
printf(" =\n");
else
printf(" <\n");
}
return ;
}