第八届ACM趣味程序设计竞赛第三场(正式赛)
A - 渐变字符串 (UESTC 1510 渐变字符串)
Source:LinPC
题解:首先预处理统计a-z字符的数量,根据渐变字符串的定义,由于总字符数较小,所以可以枚举渐变字符串的起点,然后找到由该起点起始的最大渐变字符串,然后从统计的字符中删除所用字符,如此循环操作至剩余字符数为0即可
B - 保护果实 (UESTC 1515 保护果实)
Source:cx大爷 missever
题解: 易得,只要最长的那条边的长度大于其它的边,那么就可以围成一个多边形,所以只需要维护当前的i条边中最长的那条边长度和其它边的长度和就好了
C - Little_Pro的driver朋友们和他的魔法 (UESTC 1514 Little_Pro的driver朋友们和他的魔法)
Little_Pro(小pro) 是 ProLights 的小号,哈哈
Source:ProLights
题解:贪心、字符串处理
对于 1010101...... (0 ~ n-1) 如果奇数的地方不是1就 ans1++, 如果偶数的地方不是0就 ans0++,
ans = max(ans0, ans1); //min(ans0, ans1)次交换, ans - min(ans0, ans1) 次改变司机的好坏
然后再对 010101......(0 ~ n-1) 的情况跑一遍
2个ans取最小值
复杂度 O(n)
D - 扑克斗争 (UESTC 1509 扑克斗争)
Source:CS_LYJ1997
题解:根据题目所述规则,zhong_wang手上会有1-2张牌,而cfeitong手上会有1-13张牌。如果zhong_wang手上只有一张牌,则zhong_wang必胜;
如果zhong_wang手上有两张牌,则zhong_wang会先比较自己手上较大的牌和cfeitong手上最大的牌,
如果zhong_wang手上较大的牌cfeitong压不起,则zhong_wang先出较大的牌,再出较小的牌,zhong_wang获胜;
如果zhong_wang发现cfeitong能压住zhong_wang手中较大的那张牌,则zhong_wang先出手中较小的那张牌,留下较大的那张牌。
因为cfeitong能压得起zhong_wang手上较大的牌,必然能压起zhong_wang出的这张较小的牌,因为zhong_wang手上只剩下一张牌了,
则cfeitong肯定从大的往小的出,因此判断cfeitong手上是否有两张牌比zhong_wang剩下的那张牌小,如果存在则zhong_wang胜,不存在则cfeitong胜。
数据生成说明:
test01-02为样例
test03-09为手工制造数据
test10-39为电脑随机数据
数据丢在新生群里了
建议时间限制:3000/1000MS(Java/Others)
建议内存限制:65535/65535KB(Java/Others)
E - shallowdream and girl (UESTC 1516 shallowdream and girl)
Source:钟大爷 zhong_wang
题解:解题报告
分类讨论
存在较多情况,比如a,b,c某个数为0等等,需要很细心的讨论
这里介绍a>1,b>1,c>1时的情况
此时,对于任意x<=6,显然可以构造
对于x>6,如果x=a+2*b+3*c,显然可以构造,否则,必然还有若干个a,b,c没有使用,如剩余一个a,则可以通过x-a+a构造出x
所以对于1到a+2*b+3*c的所有整数均可以构造
原题是BNUOJ的52297,网上有很多不同的思路可供参考
数据生成说明
精心构造的毒瘤数据
建议设置的时间限制,内存限制
1000ms,65535KB
标程
A-AC代码中的一份
#include
#include
int main()
{
int n,q=0,f[30]={0};
char a[1002];
scanf("%d",&n);
scanf("%s",a);
for (int i=0;i
B-标程
#include
#include
using namespace std;
int a[1000005];
int main()
{
int n,i,m;
int s;
scanf("%d",&n);
for(i = 0; i < n; i++) scanf("%d",&a[i]);
if(n < 3) {printf("-1\n"); return 0;}
m = max(a[0],a[1]);
s = min(a[0],a[1]);
for(i = 2; i < n; i++)
{
if(a[i] > m)
{
s += m;
m = a[i];
}
else s += a[i];
if(s > m) break;
}
if(i < n) printf("%d\n",i + 1);
else printf("-1\n");
return 0;
}
C-标程
#include
#include
#include
#include
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 8;
bool v[maxn];
int main()
{
#ifdef LOCAL
freopen("36.in", "r", stdin);
freopen("36.out", "w", stdout);
int T = 1;
while(T--){
#endif // LOCAL
ios::sync_with_stdio(false); cin.tie(0);
string s, s1, s2;
LL n, ans0 = 0, ans1 = 0, ans = 0;
cin >> n;
cin >> s;
s1 = s;
s2 = s;
for(int i = 0; i < n; i++){
if(s[i] == '0'){
v[i] = 0;
v[i] = 0;
}
else{
v[i] = 1;
v[i] = 1;
}
}
for(int i = 0; i < n; i++){
//cout << v[i] <<" ";
if(i % 2 == 0){
if(v[i] == 0) ;
else ans0++;
}
else{
if(v[i] == 1) ;
else ans1++;
}
}
//cout << endl;
//cout <
D-标程
#include
#include
int convert(char c)
{
if (c>='3' && c<='9') return c-48;
if (c=='T') return 10;
if (c=='J') return 11;
if (c=='Q') return 12;
if (c=='K') return 13;
if (c=='A') return 14;
return 15;
}
int main()
{
int len1,len2,c1max,c2max,ans,cnt,i;
char s1[5],s2[20];
scanf("%s",s1);
scanf("%s",s2);
len1=strlen(s1);len2=strlen(s2);
if (len1==1) ans=1;
else
{
c1max=convert(s1[len1-1]);
c2max=convert(s2[len2-1]);
if (c1max>=c2max) ans=1;
else
{
cnt=0;
for(i=0;i=2) ans=1;
else ans=0;
}
}
if (ans) printf("zhong_wang\n");
else printf("cfeitong\n");
return 0;
}
E-标程
#include
#define clr(x,y) memset((x),(y),sizeof(x))
using namespace std;
int a,b,c;
int main(void)
{
scanf("%d%d%d",&a,&b,&c);
int ans=0;
if (a==0 || b==0 || c==0)
{
if (a==0 && b==0 && c==0)
{
ans=0;
}
else if ((a==0 && b==0) || (a==0 && c==0) || (b==0 && c==0))
{
ans=a+b+c;
}
else
{
if (a==0)
{
if (b>1 && c>1)
{
ans=2*b+3*c-2;
}
else if (b>1 && c==1)
{
ans=2*b+1;
}
else if (c>1 && b==1)
{
ans=2*c+1;
}
else ans=3;
}
else if (b==0)
{
if (a>1 && c>1)
{
ans=a+3*c;
}
else if (a>1 && c==1)
{
ans=a+3*c;
}
else if (a==1 && c>1)
{
ans=2*c+1;
}
else ans=3;
}
else
{
ans=a+2*b;
}
}
}
else
{
ans=a+2*b+3*c;
}
printf("%d\n",ans);
}
Thank you!
------from ProLights