索引

题单

  • P1094 纪念品分组【贪心】
  • P1181 数列分段Section I【贪心 过水】
  • P1803 凌乱的yyy / 线段覆盖
  • P1538 迎春舞会之数字舞蹈【恶心模拟】

  • P1134 阶乘问题【数论】

## noip原题

- P1134 阶乘问题【数论】

/*
translation:

solution:
    分析:N!的末尾只会是2,4,6,8(在此题中没有0).又[2,4,6,8]中任意一个数乘6,末尾仍是本身.2 * 6 = 12,末尾为2, 4 * 6 =24,
    末尾为4, 6 * 6=36,末尾为6,8 * 6 =48,末尾为8.又末尾数字只受末尾数字影响,如4. 4 * 6得到的末尾数字与4 * 16的末尾数
    字一样.又4 * 10=40,末尾数字为4(此题不要末尾0).则4 * 2 *8==4 * 2 *5(意思是得到的末尾数字是一样的).故所有乘5的时
    候都可以换为乘8.又多次乘8末尾是有规律的.找出规律即可.
trigger:

note:
    *
date:
    2019.07.31
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;++i)
#define dwn(i,a,b) for(ll i=a;i>=b;--i)
template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define mem(a,b) memset(a,b,sizeof(a))

#define N

int n,ans=1;
int a[4]={6,8,4,2};
int main(){
    #ifdef WIN32
    freopen("","r",stdin);
    #endif
    rd(n);
    while(n){
        rep(i,1,n%10)//除了5之外,其他数字原样乘.
        //n%10 的原因:答案只受末尾数字影响
            if(i!=5)
                ans=ans*i%10;//跳过乘5(此时可以放心%10)
        n/=5;//n/5即少乘了多少次5
        //即乘8的次数
        ans=ans*a[n%4]%10;//四次一循环(此时可以放心%10)
    }
    printf("%d",ans);
    return 0;
}

P1803 凌乱的yyy / 线段覆盖

在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少。
最左边的线段放什么最好?
显然放右端点最靠左的线段最好,从左向右放,右端点越小妨碍越少
其他线段放置按右端点排序,贪心放置线段,即能放就放

- P1094 纪念品分组

/*
translation:
    他要把购来的纪念品根据价格进行分组,
    但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。
solution:
    第一次交RE了,因为循环结束有两种情况:
        - 情况1:刚好取完最后两个
        - 情况2:取完最后一个,ans++
trigger:

note:
    *贪心,排序
date:
    2019.07.31
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;++i)
#define dwn(i,a,b) for(ll i=a;i>=b;--i)
template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define mem(a,b) memset(a,b,sizeof(a))

#define N 30010

ll w,ans,n;
ll a[N];

int main(){
    #ifdef WIN32
    freopen("fenzu.txt","r",stdin);
    #endif
    rd(w);
    rd(n);
    rep(i,1,n)rd(a[i]);
    sort(a+1,a+n+1);
    ll i=1;
    ll j=n;
    while(1){
        if(a[i]+a[j]<=w){
            ans++;
            a[i]=INT_MAX,a[j]=INT_MAX;
            i++,j--;
        }
        else{
            ans++;
            a[j]=INT_MAX;
            j--;
        }
        if(i==j+1)break;//////////////不要忘了处理情况1
        if(i==j){//情况2
            ans++;
            break;
        }
    }
    printf("%lld",ans);
    return 0;
}
/*
100
9
90
20
20
30
50
60
70
80
90
*/
//6 

P1538 迎春舞会之数字舞蹈

/*
translation:

solution:

trigger:

note:
    *
date:
    2019.07.31
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(ll i=a;i<=b;++i)
#define dwn(i,a,b) for(ll i=a;i>=b;--i)
template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

int k,h,w,r;
char bj[64][8670];
bool a[10][7]={
                {1,1,1,1,1,1,0},
                {0,1,1,0,0,0,0},
                {1,1,0,1,1,0,1},
                {1,1,1,1,0,0,1},
                {0,1,1,0,0,1,1},
                {1,0,1,1,0,1,1},
                {1,0,1,1,1,1,1},
                {1,1,1,0,0,0,0},
                {1,1,1,1,1,1,1},
                {1,1,1,1,0,1,1}
            };

void find(char c){
    if(a[c-'0'][0]) for(int i=r+1;i<r+w-2;i++) bj[0][i]='-';
    if(a[c-'0'][1]) for(int i=1;i<=k;i++) bj[i][r+w-2]='|';
    if(a[c-'0'][2]) for(int i=k+2;i<h-1;i++) bj[i][r+w-2]='|';
    if(a[c-'0'][3]) for(int i=r+1;i<r+w-2;i++) bj[k+k+2][i]='-';
    if(a[c-'0'][4]) for(int i=k+2;i<h-1;i++) bj[i][r]='|';
    if(a[c-'0'][5]) for(int i=1;i<=k;i++) bj[i][r]='|';
    if(a[c-'0'][6]) for(int i=r+1;i<r+w-2;i++) bj[k+1][i]='-';
}

int main() {
    string s;
    rd(k);
    cin>>s;
    h=k*2+3;
    w=k+3;//每个数字的宽度(包含一个空格)
    for(int i=0;i<s.length();i++){
        find(s[i]);
        r+=w;
    }
    for(int i=0;i<h;i++){
        for(int j=0;j<r;j++){
            if(bj[i][j]) putchar(bj[i][j]);
            else putchar(' ');
        }
        putchar('\n');
    }
    return 0;
}
01-20 08:28