Problem A: 求和
Time Limit: 1000 ms Memory Limit: 128 MB
Description


用一个数组记录每个数总共出现了几次,用maxn和minn记录最大和最小值,最后减去即可,不多说。
AC code:
#include<iostream>
#include<algorithm>//忽略这个头文件
using namespace std;
long long n,x,y,s,maxn,minn=0x7fffffff,b[10005];
int main(){
cin>>x>>y>>n;
int temp;
for(int i=1;i<=n;i++){
cin>>temp;
if(temp>=x&&temp<=y){
s+=temp;
b[temp]++;
if(temp>maxn)maxn=temp;
if(temp<minn)minn=temp;
}
}
cout<<s-b[maxn]*maxn-b[minn]*minn;
}
Problem B: 素数
Time Limit: 1000 ms Memory Limit: 128 MB
Description


分离开每个数,检查是否是素数,直接水掉。
AC code:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char ch[11];
int a[15];
bool check(long long n){
if(n==1||n==0)return 0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)return 0;
}
return 1;
}
int main(){
cin>>ch;
for(int i=0;i<strlen(ch);i++){
a[i+1]=ch[i]-'0';
}
long long s=0,sum=0;
for(int i=1;i<=strlen(ch);i++){//i为这个数的数位
for(int j=1;j<=strlen(ch)-i+1;j++){//j为起始位置
for(int k=j;k<j+i;k++){//不解释
s=s*10+a[k];
}
if(check(s))sum++;
s=0;
}
}
cout<<sum;
}
Problem C: 疯狂阶乘
Time Limit: 1000 ms Memory Limit: 128 MB
Description

刚做这道题时,感受到了来自出题者深深的恶意。后来发现这题是道数学题。。
(1! +2! +...+n! )%p
=1! %p+2! %p+...+n! %p
=1! %p+2! %p+...+(p-1)! %p+0 (因为比p大的数的阶乘mod p都为0)
看到这里,可以直接上long long了。
AC code:
#include<iostream>
#include<string>
using namespace std;
long long n,p,s,t=1;
int main(){
cin>>n>>p;
if(n>p)n=p;
for(int i=1;i<=n;i++){
t=(t%p)*(i%p);
s=(s+t)%p;
}
cout<<s;
}//没错就是这么短
Problem D: 咒语
Time Limit: 1000 ms Memory Limit: 128 MB
Description




看完题目,作为三体的忠实读者的我有话想说。。。
其实用一个数组记录下星图,然后枚举就行了。
AC code:
#include<iostream>
using namespace std;
int n,m,k,ans,tar;
bool map[4001][4001];
struct data{
int x,y;
}a[101],b[3001];
int main(){
cin>>n;
int x,y;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
map[a[i].x+2000][a[i].y+2000]=1;
}
cin>>m;
while(m--){
ans=0;
cin>>k;
for(int i=1;i<=k;i++){
cin>>b[i].x>>b[i].y;
}
for(int i=1;i<=n;i++){
bool flag=1;
for(int j=1;j<=k;j++){
if(!map[a[i].x+2000-b[j].x][a[i].y+2000-b[j].y]){
flag=0;
break;
}
}
if(flag){
ans++;
tar=i;
}
}
if(ans==1)cout<<tar<<endl;
else cout<<"No solution."<<endl;
}
return 0;
}
Problem E: 合并线段
Time Limit: 1000 ms Memory Limit: 128 MB
Description


先按后一个点排序一遍,再用最长不下降子序列动规跑一次就好了。
AC code:
#include<iostream>
#include<algorithm>
using namespace std;
struct data{
int x,y,s;
}a[505];
struct data2{
int len,s;
}dp[505];
int anss,anslen=1;
bool cmp(data x,data y){
if(x.y==y.y)return x.x<y.x;
return x.y<y.y;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
a[i].s=a[i].y-a[i].x;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
dp[i].len=1;
dp[i].s=a[i].s;
anss=max(anss,a[i].s);
}
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(a[j].y==a[i].x){
if(dp[j].s+a[i].s>dp[i].s){
dp[i].s=dp[j].s+a[i].s;
dp[i].len=dp[j].len+1;
}
if(dp[j].s+a[i].s==dp[i].s){
if(dp[j].len+1>dp[i].len){
dp[i].len=dp[j].len+1;
dp[i].s=dp[j].s+a[i].s;
}
}
}
}
if(dp[i].s==anss){
if(dp[i].len>anslen){
anslen=dp[i].len;
}
}
else{
if(dp[i].s>anss){
anss=dp[i].s;
anslen=dp[i].len;
}
}
}
cout<<anss<<" "<<anslen;
}
好了,大家喜欢的点个赞呗~(别说我打广告)