三道比较简单的题,还以为是八校考试的题目,但是并不是,无语了,第三题其实看了挺久的,一看到图,就想到了二分图,网络流之类的算法,但是尽力往这个方向想了好久都没什么思路,
最后从简单入手,然而没什么结果,第一题是真的水,一推就知道了。
谜题
时间限制: 1 Sec 内存限制: 128 MB
提交: 90 解决: 47
[提交][状态][讨论版]
题目描述
输入
一行一个数字N(N<=99)
输出
如果能,输出“YES”;否则输出“XLSB”;
样例输入
3
样例输出
YES
提示
【数据规模】
对于10%的数据,N<=1;
对于20%的数据,N<=3;
对于50%的数据,N<=4;
对于100%的数据1<=N<=99;
#include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #include<iostream> using namespace std; int n; int main() { scanf("%d",&n); ) printf("YES\n"); else printf("XLSB\n"); }
题意什么的不要了
选修课
时间限制: 1 Sec 内存限制: 128 MB
提交: 172 解决: 61
[提交][状态][讨论版]
题目描述
温州中学开放了许多选修课,每节选修课都属于一种种类。精力旺盛的黄小龙同学想要尽可能多的参加选修课,但是他只能选择M种种类的课程。当然,对于他所选的种类,他会去上所有该种类的课。现在他想知道他最多能上几节选修课,以及上最多选修课的方案数。
两种方案被认为不同当且仅当一种方案中存在另一种方案所没有的选修课。
输入
第一行一个只由小写字母组成,长度为N的字符串。表示有N节选修课,以及每节选修课的种类。
第二行一个正整数M。
输出
输出一行,两个用空格隔开的正整数,分别表示最多选修课数量和方案数。
样例输入
abcde
1
1
ababac
2
2
样例输出
1 5
5 1
提示
【数据规模】
对于30%的数据,M==1;
对于另外30%的数据,每种种类的选修课最多只有一节;
对于100%的数据1<=M<=26、1<=N<=100000;
暴力求个组合数就可以了,源代码快拍打错了,然后求组合数的时候有个优化就是C(20,2)=C(20,18)可以通过这个少乘,然后LL就可以过了。
#include<cstring> #include<algorithm> #include<iostream> #include<cmath> #include<cstdio> using namespace std; int n; ]={}; ]; bool cmp(int x,int y){return x>y;} long long C(int m,int n) { ; ;i<=m;i++) res=(long long)(res*i); ;i<=n;i++) res=(long long)(res/i); return res; } int main() { scanf("%s%d",s,&n); int len=strlen(s); ;i<len;i++) a[s[i]-]++; sort(a+,a++,cmp); ; ;i<=n;i++) res+=a[i]; printf("%lld ",res); int l=n,r=n; &&a[l]==a[n]) l--; l++; &&a[r]==a[n]) r++; r--; long long ans; ans=C(r-l+,min(n-l+,r-n)); printf("%lld\n",ans); }
满分代码
质数
时间限制: 1 Sec 内存限制: 128 MB
提交: 106 解决: 20
[提交][状态][讨论版]
题目描述
宿管有一套神奇的控制系统来控制寝室的灯的开关:
共有N盏灯,标号为1到N,有M个标有不同质数的开关,开关可以控制所有标号为其标号倍数的灯,按一次开关,所有其控制的灭着的灯都点亮,所有其控制的亮着的灯将熄灭。现在,宿管可以无限的按所有开关,所有灯初始状态为熄灭,请求出最多能点亮几盏灯。
输入
输入有多组数据,第一行一个正整数T表示数据组数。
每组数据第一行两个整数N,M。
第二行M个不同的质数表示开关上的标号,保证所有标号<=N。
输出
对于每组数据输出一行一个整数表示最多亮灯数。
样例输入
4
10 2
2 5
21 4
2 3 5 7
100 1
5
100 3
3 19 7
10 2
2 5
21 4
2 3 5 7
100 1
5
100 3
3 19 7
样例输出
5
11
20
42
11
20
42
提示
【数据范围】
对于50%的数据,N<=15;
对于100%的数据,T<=10,N<=1000。
这道题就是求√n以内的质数,这样比√n大的质数两两之间已经超过了n因此不会相互影响,可以发信啊每个开关只开一次是有意义的,多开没意义。
#include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #include<cstring> #include<queue> using namespace std; ,NN=; int n,m,ans,k; int boo[NN],prime[NN]; bool cmp(int x,int y){return x<y;} void dfs(int ci) { if (ci==k) { ,num; queue<int>q; while(!q.empty()) q.pop(); ;i<=m;i++) { num=; for (int j=prime[i];j<=n;j+=prime[i]) ) num++; else num--; ) { q.push(i); for (int j=prime[i];j<=n;j+=prime[i]) boo[j]^=; } } ;i<=n;i++) if (boo[i]) x++; ans=max(ans,x); while (!q.empty()) { int i=q.front(); q.pop(); for (int j=prime[i];j<=n;j+=prime[i]) boo[j]^=; } } else { ci++; dfs(ci); for (int i=prime[ci];i<=n;i+=prime[ci]) boo[i]^=; dfs(ci); for (int i=prime[ci];i<=n;i+=prime[ci]) boo[i]^=; } } void solve() { ans=-INF; memset(boo,,sizeof(boo)); dfs(); printf("%d\n",ans); } int main() { int Cas; scanf("%d",&Cas); while (Cas--) { scanf("%d%d",&n,&m); ;i<=m;i++) scanf("%d",&prime[i]); sort(prime+,prime+m+,cmp); k=m; while (prime[k]>(int)sqrt(n)) k--; solve(); } }